我正在尝试获取一个日期并根据另一个时区更新它,我在下面编写了这段代码。我注意到,然后我设置了新的时区,即 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/