我在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/