我有一个关于 java 时区的棘手问题(至少对我来说)。我将从一个按预期工作的示例开始:
TimeZone tz = TimeZone.getDefault();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
simpleDateFormat.setTimeZone(tz);
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(tz);
calendar.set(Calendar.HOUR_OF_DAY, 0);
System.out.println("0: " + simpleDateFormat.format(calendar.getTime()));
calendar.set(Calendar.HOUR_OF_DAY, 1);
System.out.println("1: " + simpleDateFormat.format(calendar.getTime()));
calendar.set(Calendar.HOUR_OF_DAY, 2);
System.out.println("2: " + simpleDateFormat.format(calendar.getTime()));
输出:
0 4/28/17 12:27 AM
1: 4/28/17 1:27 AM
2: 4/28/17 2:27 AM
现在来一点魔法:
TimeZone tz = TimeZone.getTimeZone("Africa/Cairo");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
simpleDateFormat.setTimeZone(tz);
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(tz);
calendar.set(Calendar.HOUR_OF_DAY, 0);
System.out.println("0: " + simpleDateFormat.format(calendar.getTime()));
calendar.set(Calendar.HOUR_OF_DAY, 1);
System.out.println("1: " + simpleDateFormat.format(calendar.getTime()));
calendar.set(Calendar.HOUR_OF_DAY, 2);
System.out.println("2: " + simpleDateFormat.format(calendar.getTime()));
输出:
0: 4/28/17 1:31 AM
1: 4/28/17 1:31 AM
2: 4/28/17 2:31 AM
有人可以解释一下为什么值 0 和 1 的 HOUR_OF_DAY 将小时设置为特定时区的相同值吗?
最佳答案
您的计算机具有旧版本的时区数据,其中埃及会将时钟调快于 2017 年 4 月 28 日开始的本地时间午夜。因此 12:31am 不会存在,Java 会向前跳过改为一小时1。
2016 年 7 月 5 日,IANA 时区数据 2016f 发布,非洲/开罗时区更改为从该时点起不再遵守夏令时。 (这是一个非常晚的公告,因为下一次更改是 2016 年 7 月 8 日。)
您可以在 http://nodatime.github.io/tzvalidate/ 处查看不同版本的 IANA 数据中每个 IANA 时区的所有转换。 。 (免责声明:我构建了该页面。我启动了 tzvalidate 项目来验证不同的日期/时间库是否以相同的方式理解时区数据。)
<小时/>1 我认为 API 应该强制您说明在这种情况下您想要发生的情况,但我不会详细讨论 所有问题 java.util.Calendar
在这里...
关于java - HOUR_OF_DAY 为值 0 和 1 设置相同的小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43684054/