代码
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}}不同?
答案 0 :(得分:12)
根据Oracle Documentation明确提到,
public static Calendar getInstance()
使用默认时区和区域设置获取日历。返回的日历基于默认时区的当前时间和默认语言环境。
default time zone
由public static TimeZone getDefault()
获得,TimeZone.getDefault()中提及
获取此主机的默认TimeZone。默认TimeZone的来源可能因实施而异。
除非您使用default
函数明确设置public static void setDefault(TimeZone zone)
,否则它将返回您计算机中设置的TimeZone
时区。
我相信上述解释可以解答您的问题,
编辑:根据您编辑过的问题
为什么日历的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
打印出来。