java - HOUR_OF_DAY 为值 0 和 1 设置相同的小时

标签 java timezone

我有一个关于 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/

相关文章:

GMT +x 地区的 Android 日历全天 Activity 日期关闭一天

c# - 如何在 Sitecore 中管理时区?

.net - F# JSON 类型提供程序 : Handling DateTime and TimeZone

java - primefaces:同时进行 actionListener 和重定向

java - Java 8 中的闭包会启用使用构造函数指针的工厂方法吗?

java - 使用类加载器加载内部类

javascript - Google Apps Script formatDate 使用用户时区而不是 GMT

java - xuggler 输入输出流处理程序 SIGSEGV

java ms访问连接

mysql - 如何使 MySQL 的 NOW() 和 CURDATE() 函数使用 UTC?