我尝试使用日历类更改 TimeZone ,我发现我应该使用 DateFormat 而不是在Calendar对象上设置时区。 现在,我得到了改变时区的解决方法。
但是当我在玩Calendar时,我仍然对输出感到困惑......
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
System.out.println("Time Zone : " + cal.getTimeZone()); // Default Time Zone
System.out.println("Date : " + cal.getTime());
System.out.println("------------Setting Time zone to IST------------");
cal.setTimeZone(TimeZone.getTimeZone("IST")); // Setting Time Zone to IST
System.out.println("Time Zone : " + cal.getTimeZone());
System.out.println("Date : " + cal.getTime());
}
输出
Time Zone : sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,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]]
Date : Fri Dec 05 10:45:56 EST 2014
------------Setting Time zone to IST------------
Time Zone : sun.util.calendar.ZoneInfo[id="IST",offset=19800000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]
Date : Fri Dec 05 10:45:56 EST 2014
这是我的问题,
在我打印 cal.getTimeZone()时设置时区后,它将时区更改为IST(这是理想情况)。但是当我打印 cal.getTime()(它仍然在EST )时,为什么它没有影响日期?
P.S。:我想知道背后的原因,我对学习如何改变时区不感兴趣!
谢谢!
答案 0 :(得分:2)
cal.getTime()
仍在打印EST的原因是因为java Date
对象(cal.getTime()
返回的内容)不包含时区信息
Date
对象的字符串表示具有误导性,因为它包含计算机的时区(在您的情况下为EST)。我住在俄勒冈州,所以如果我要运行你的代码,我会得到PST。但是,尽管有这种String表示,Date
对象中没有任何TimeZone字段。
在您的代码中,您成功设置了日历的TimeZone,但遗憾的是,当您从日历中提取Date
对象时,您无法获取TimeZone。
为什么Java的创建者会这样做,你可能会问?好吧,除了那个糟糕的决定之外,没有好的答案,并且还解释了为什么在Java 8中他们创建了一个用于处理日期/时间的全新库。
还应注意,DateFormat
对象确实包含TimeZone字段,因此您可以使用它来打印在特定时区中的时间。见How to set time zone of a java.util.Date?