【问题标题】:Setting TimeZone on instance of Calendar and when calling getTime() the time is not updated based on timezone在 Calendar 实例上设置 TimeZone 并在调用 getTime() 时不会根据时区更新时间
【发布时间】:2011-12-07 21:21:58
【问题描述】:

我正在尝试获取一个 Date 并根据另一个 timezome 对其进行更新,并且我在下面编写了此代码。然后我注意到我设置了新的时区,即 CST,对 getHour 的调用反映了更新,但是当 getTime() 时,日期不反映基于上次设置的时区的时间。

TimeZone zone = TimeZone.getTimeZone(TimeZoneConstants.AmericaNewYork);
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(TimeZoneConstants.AmericaNewYork));
    System.out.println(cal.get(Calendar.HOUR_OF_DAY));
    System.out.println(DateHelper.formatDate(cal.getTime(), DateHelper.FORMAT_TIME_LONG));
    Calendar cal2 = Calendar.getInstance();
    TimeZone zone2  = cal2.getTimeZone();
    cal.setTimeZone(zone2);
    System.out.println(cal.get(Calendar.HOUR_OF_DAY));
    System.out.println(DateHelper.formatDate(cal.getTime(), DateHelper.FORMAT_TIME_LONG));

输出

16 中部标准时间下午 3:14:36 15 中部标准时间下午 3:14:36

从这里控制台输出如下,您可以看到小时已更新,但从 getTime() 返回的 Date 对象未更新。我可以编写一个 uitl 方法来获得我想要的东西,但我想知道为什么会默认发生这种情况? - 邓肯·克雷布斯

【问题讨论】:

  • 非常感谢,只是快速浏览了用户指南,它似乎简化了我想做的很多事情。 - 邓肯

标签: java date calendar


【解决方案1】:

从纪元以来的原始毫秒数,您从未更改过时间。更改时区只会更改“人类”表示。用java.util.Date 表示时,中部时间下午 3:14 和东部时间下午 4:14 完全相同。自纪元以来,它们都是相同数量的原始时间。如果您希望人类可读的表示采用东部时间,则需要将其告知进行格式化的 DateHelper。

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2016-10-21
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多