java.util.Calendar-1947年

标签 java

我在WSO2平台中发现了一个有趣的行为,该事件使用Calendar将String转换为Date。
WSO2使用java.util.Calendar作为最终结果。
我发现,如果代码段中使用的日期是01.01.1947-23.02.1947,那么结果总是在一天前给我们。
我发现我们的时区正在这样做,因为它是一个小时前。意思是日历将结果向后减少一小时,因此我们可以在晚上11点之前获得结果。
我们已经通过不转换为日期来解决该问题。因此,这不是问题。
问题是,为什么仅在日期01.01.1947-23.02.1947会发生这种情况?
这是可以模拟问题的示例代码片段:

    int year = 1947;
    int month = 2;
    int day = 23;
    int timezoneOffset = TimeZone.getDefault().getRawOffset();
    Calendar calendar = Calendar.getInstance();
    calendar.clear();
    calendar.set(1, year);
    calendar.set(2, month - 1);
    calendar.set(5, day);
    calendar.set(15, timezoneOffset);

    System.out.println(calendar.getTime());
在我的时区中,如果要测试我的时区(捷克共和国),timezoneOffset的结果为3600000。
注意,这是用WSO2编写的代码,万一有疑问,我将无法更改它。
我为此使用的Java版本是:openjdk 11.0.8 2020-07-14
链接: WSO2 platform

最佳答案

1947年2月23日,Czech Republic(当时的Czechoslovakia)从格林尼治标准时间(GMT)时区传到了CET时区,因此时钟提前了1个小时。相反的情况发生在1946年12月1日(CET-> GMT,-1小时)。
之所以发生这种情况,是因为当时本地政府实现了Winter Time,出于同样的原因,我们通常使用DST,即(据说)可以节省能源消耗。
链接:Time Changes in Prague Over the Years on timeanddate.com

关于java.util.Calendar-1947年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66776697/

相关文章:

java - Java中如何声明和消费事件

java - Java Util并发池选择哪个

java - 在后台安全地长时间运行 java 进程

java - 像素点,桌面和安卓

java - 以所有可能的方式将列表拆分为两个子列表

java - 如何通过个人设置安装 MySQL 或 MsSQL

java - Android 崩溃 onCreate() - Fragment 无法转换为 androidx.navigation.fragment.NavHostFragment

java - 如何通过Java中给出的例子来掌握二分查找递归的概念?

Java:无法修复需要 java.util.Collection<?扩展 java.lang.String>

java - 使用 split 使用分隔符选项卡 "\t"在 Java 中解析字符串