java - 在 Calendar 实例上设置 TimeZone ,并且在调用 getTime() 时,时间不会根据时区更新

标签 java date calendar

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

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.util.Date 表示时,中部下午 3:14 和东部下午 4:14 完全相同。自纪元以来,它们的原始时间量都是相同的。如果您希望人类可读的表示形式为东部时间,则需要将其告诉 DateHelper 进行格式化。

关于java - 在 Calendar 实例上设置 TimeZone ,并且在调用 getTime() 时,时间不会根据时区更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8422733/

相关文章:

java - 循环音频和输入对话框取消

java - 如何在android中打印一周中的每一天

javascript - UTC 日期转换为本地日期不起作用,Safari

android - 在闹钟管理器 Android 中设置时间 - 立即触发闹钟

ios - 使用 NSUserDefaults 或 CoreData 存储事件日历

java - 如何将 JMX JVM 选项传递给 Hadoop Mapper 和Reducer

java - 使用来自用户的数据逐渐填充数组

Java Socket 构造函数,Socket(String hostName,int port),挂起

javascript - Jquery 数据表日期格式 "DD/MM/YYYY"这些格式的排序不正确

java - 小年份日期解析的奇怪行为