>我试图使用日历类更改时区,我发现我应该使用DateFormat而不是在日历对象上设置时区。现在,我得到了更改时区的解决方法。
但是当我玩日历时,我仍然对输出感到困惑......
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中(时它不会影响日期?
PS:我想知道这背后的原因,我对学习如何更改时区不感兴趣!
谢谢!!
cal.getTime()
仍在打印 EST 的原因是 java 的 Date
对象(这是cal.getTime()
返回的对象(不包含时区信息。
Date
对象的字符串表示形式具有误导性,因为它包括计算机的时区(在您的情况下为 EST(。 我住在俄勒冈州,所以如果我要运行你的代码,我会得到 PST。 但是,尽管有这种字符串表示形式,Date
对象中没有任何时区字段。
在您的代码中,您成功地设置了日历的时区,但不幸的是,当您从日历中提取Date
对象时,您无法获取时区。
你可能会问,为什么Java的创造者会这样做? 好吧,除了这是一个糟糕的决定之外,没有好的答案,并且还解释了为什么在Java 8中他们创建了一个全新的库来处理日期/时间。
还应该注意的是,DateFormat
对象确实包含时区字段,因此您可以使用它来打印出特定时区的时间。 请参阅如何设置 java.util.Date 的时区?