在java中使用Calendar设置时区

时间:2014-12-05 16:16:10

标签: java date calendar timezone date-format

我尝试使用日历类更改 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。:我想知道背后的原因,我对学习如何改变时区不感兴趣!

谢谢!

1 个答案:

答案 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?