Calendar.getInstance() 默认返回绑定当前默认时区的日历对象,该时区由 JVM 启动时确定(继承自系统或通过 -Duser.timezone 设置),调用 cal.getTimeZone().getID() 可验证;已有 Calendar 实例的时区不会因 TimeZone.setDefault() 而改变。

Calendar.getInstance() 默认就返回当前默认时区的日历对象,无需额外指定时区。Java 的 Calendar.getInstance() 内部会调用 Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault()),因此它天然基于 JVM 启动时确定的默认时区(通常继承自操作系统,也可通过 -Duser.timezone=xxx 设置)。
确认当前默认时区
可通过以下方式验证当前默认时区是否符合预期:
- 打印
TimeZone.getDefault().getID(),例如输出"Asia/Shanghai"或"GMT+08:00" - 注意:该值可能受系统环境、JVM 参数或运行时调用
TimeZone.setDefault(...)影响
获取并使用默认时区日历
直接调用即可,结果已绑定默认时区:
Calendar cal = Calendar.getInstance(); // 自动使用 TimeZone.getDefault() System.out.println(cal.getTimeZone().getID()); // 输出当前默认时区 ID
后续对 cal 的 get/set 操作(如 cal.get(Calendar.HOUR_OF_DAY))均按该时区解释时间值。
立即学习“Java免费学习笔记(深入)”;
避免常见误解
-
Calendar.getInstance()不等于“UTC 日历”或“无时区日历”——它始终有关联时区 - 不要误以为
new GregorianCalendar()更“原始”:它等价于Calendar.getInstance(),同样使用默认时区 - 若需其他时区,必须显式传入,例如
Calendar.getInstance(TimeZone.getTimeZone("UTC"))
时区变更影响说明
如果程序中动态修改了默认时区(TimeZone.setDefault(...)),之后调用 getInstance() 将使用新时区。但已有 Calendar 实例的时区不会改变——每个 Calendar 对象在创建时就固定了其 TimeZone。


















