java.util.Calendar的默认时区是什么?

public String testDate(){ TimeZone.setDefault(TimeZone.getTimeZone("US/Eastern")); Calendar fromDate = Calendar.getInstance(); Date date= new Date(); System.out.println(fromDate); System.out.println(date); } 

我的日历变量在调试下面的日历变量时显示cdate值2013-12-09T00:00:00.000Z和时间值1386649779590

 Calendar cal = Calendar.getInstance(); 

我在打印对象时看到的完整日历详细信息

 System.out.println(cal); 

安慰

 java.util.GregorianCalendar[time=1386649779590,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="US/Eastern",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=US/Eastern,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2013,MONTH=11,WEEK_OF_YEAR=50,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=343,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=11,HOUR_OF_DAY=23,MINUTE=29,SECOND=39,MILLISECOND=590,ZONE_OFFSET=-18000000,DST_OFFSET=0] 

虽然我的java.util.date变量显示日期为Mon Dec 09 07:37:50 EST 2013 ,同时调试日期变量

 Date date= new Date(); 

我设置的默认timezone是在程序启动指定的EST

 TimeZone.setDefault(TimeZone.getTimeZone("US/Eastern")); 

我正在从timezone IST工作

我的问题是

为什么Calendar calDate()Date()不同?

根据Oracle文档 ,明确提到,

public static Calendar getInstance()
使用默认时区和区域设置获取日历。 返回的日历基于默认时区中具有默认语言环境的当前时间。

default time zonepublic static TimeZone getDefault()并在TimeZone.getDefault()中提到

获取此主机的默认TimeZone。 默认TimeZone的来源可能因实施而异。

除非您使用public static void setDefault(TimeZone zone)函数显式设置TimeZone ,否则它将返回计算机中设置的default时区。

我相信上面的解释可以回答你的两个问题,

  1. java.util.Calendar的默认时区是什么?
  2. 为什么我的日历类型的变量cal显示的时间不是IST或EST。

编辑:根据您编辑的问题

为什么日历的cal和Date()的日期不同?

当你调用System.out.println(date); 然后调用toString()函数,如果你查看日期的源代码,你会发现它通过调用默认时区的displayName函数来返回时区的3个字母,这是你的案例EST 3个字母的简写,即US Eastern Standard Time (GMT-05:00) Indiana (East)

日期本身没有任何时区。 它的toString()方法使用当前的默认时区来返回一个String

通常,您使用getDefault获取TimeZone ,它根据程序运行的时区创建TimeZone 。 例如,对于在日本运行的程序, getDefault会根据日语标准时间创建一个TimeZone对象。

检查TimeZone了解更多信息

你提到“cdate”,我注意到Calendar对象里面有一个名为cdate 。 在运行示例代码时,我看到cdate字段确实初始化为2013-12-10T00:00:00.000Z (当然现在是24小时后)。

所以? 当你永远不会直接使用它们时,我不知道你为什么要查看类的内部字段。

那么,你的解决方案是忽略它。 不要担心日历的cdate字段; 担心实际影响你的程序的事情。

CalendartoString()不是很漂亮,用于调试; 你应该调用cal.getTime() ,它会给你一个java.util.Date ,你可以直接或使用java.text.DateFormatter打印出来。