java中calendar.getinstance()默认返回gregoriancalendar实例,因其是公历标准实现,适用于国际通用日期操作,自动适配系统locale与时区,无需显式创建或转型。

Java 中 Calendar.getInstance() 默认返回的是 GregorianCalendar 实例,这是 Java 对公历(格里高利历)的标准实现,适用于绝大多数日常日期时间操作。它不是抽象类,可以直接使用,也兼容 Calendar 的所有通用方法。
为什么默认是 GregorianCalendar?
因为公历是国际通用历法,JVM 在多数地区(包括中国、美国、欧洲等)的默认 Locale 和时区下,会自动选择 GregorianCalendar 作为具体实现。你无需显式 new,也不用强制转型——但若需调用其特有方法(如 isLeapYear()),才需要向下转型。
基本用法:获取并操作当前时间
直接调用 getInstance() 即可获得一个已初始化为当前系统时间的 GregorianCalendar 对象:
- 不传参:使用默认时区和默认 Locale(通常是系统设置)
- 传入
TimeZone:指定时区,例如Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai")) - 传入
Locale:影响星期起始日、月份/星期名称等显示逻辑(如Locale.CHINA下一周从周一开始)
常用操作示例
以下操作均基于 Calendar 接口,因此对 GregorianCalendar 同样适用:
-
获取字段值:如
cal.get(Calendar.YEAR)、cal.get(Calendar.DAY_OF_MONTH) -
设置字段值:如
cal.set(Calendar.MONTH, Calendar.JANUARY)(注意月份从 0 开始) -
增减时间:如
cal.add(Calendar.DAY_OF_YEAR, 7)表示加 7 天 -
转为 Date 或毫秒:用
cal.getTime()或cal.getTimeInMillis()
需要特别注意的细节
GregorianCalendar 继承自 Calendar,但有自己独有的行为:
- 支持闰年判断:
((GregorianCalendar) cal).isLeapYear(2024)返回 true - 1582 年 10 月存在“跳日”(1582-10-04 后直接是 1582-10-15),
GregorianCalendar默认启用该历史修正;如需儒略历兼容模式,可调用setGregorianChange() - 月份从 0 开始(
JANUARY = 0),星期天是SUNDAY = 1(与多数 Locale 一致,但要注意getFirstDayOfWeek()可能不同)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











