【发布时间】:2018-06-03 22:50:36
【问题描述】:
我将日历实例设置为 00:00 的 UTC 日期,但是一旦我提前 1 小时返回结果
Calendar cal = Calendar.getInstance(TIMEZONE_UTC, Locale.ENGLISH);
cal.set(2017, 12 - 1, 15);
cal.set(Calendar.AM_PM, Calendar.AM);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
System.out.println(cal.getTime());
// Fri Dec 15 01:00:00 CET 2017 but should be 00:00:00
我想有冬季/夏季偏移,但我没有在公历或日历元素中找到任何描述来处理这个问题
【问题讨论】:
-
你得到的时间是正确的,00:00:00 UTC。愚弄您的是
Date.toString()(从System.out.println()隐式调用)正在将生成的字符串的时间转换为您自己的时区(使用JVM 时区设置)。 -
我建议你停止使用早已过时的
Calendar类。java.time, the modern Java date and time API,使用起来更好。并且使用现代 API 中的ZonedDateTime(或OffsetDateTime或Instant)将解决您的问题。 -
您是否希望这个日期的 UTC 午夜同时也是 CET 时区的午夜 (00:00:00)?不可能,因为对于那个特定的未识别区域,CET 在那个日期比 UTC 早一个小时。我说不明是因为 CET 不是时区,而是时区的影响,例如
Europe/London。 -
简而言之:该日期 00:00:00 UTC 是 01:00:00 CET。
标签: java java-calendar