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

时间:2013-12-09 12:53:15

标签: java date 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

我的问题是

为什么cal的{​​{1}}和Calendar的{​​{1}}不同?

4 个答案:

答案 0 :(得分:12)

根据Oracle Documentation明确提到,

  

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

default time zonepublic static TimeZone getDefault()获得,TimeZone.getDefault()中提及

  

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

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

我相信上述解释可以解答您的问题,

  1. java.util.Calendar的默认时区是什么。?
  2. 为什么我的日历类型的变量cal显示的时间不是IST或EST。?
  3. 编辑:根据您编辑过的问题

      

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

    当您致电System.out.println(date);时,会调用toString()函数,如果您查看Source Code of Date,您会发现它通过调用displayName函数返回时区的3个字母缩写默认时区,在您的案例EST中为3个字母的简写,即U.S. Eastern Standard Time (GMT-05:00) Indiana (East)

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

检查TimeZone了解更多

答案 3 :(得分:1)

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

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

然后,您的解决方案是忽略它。不要担心日历的cdate字段;担心会影响你的计划的事情。

toString()的{​​{1}}不是很漂亮,用于调试;你应该致电Calendar,它会给你cal.getTime(),然后你可以直接打印或使用java.util.Date打印出来。