作者:不可能爱你啊 | 来源:互联网 | 2023-06-24 19:42
我在WSO2平台中发现了一个有趣的行为,使用Calendar将字符串转换为日期。WSO2使用java.util.Calendar作为最终结果。我发现如果在下面的代码片段中使用
我在 WSO2 平台中发现了一个有趣的行为,使用 Calendar 将字符串转换为日期。WSO2 使用 java.util.Calendar 作为最终结果。我发现如果在下面的代码片段中使用了 01.01.1947 - 23.02.1947 的日期,结果总是在一天前给我们。我发现它是我们的时区这样做,因为它向前一小时。意思是日历将结果倒退一小时,我们得到晚上 11 点前的一天。
我们已经通过不转换为 Date 来解决问题。所以这不是问题。
问题是,为什么这只发生在 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平台
回答
1947 年 2 月 23 日,捷克共和国(当时的捷克斯洛伐克)从格林威治标准时间时区变为欧洲中部时间,因此时钟提前了 1 小时。相反的情况发生在 1946 年 12 月 1 日(欧洲中部时间->格林威治标准时间,-1 小时)。
发生这种情况是因为当时当地政府实施了冬令时,出于与我们通常有夏令时相同的原因,即(据说)节省能源消耗。
链接:timeanddate.com 上布拉格多年来的时间变化