gpt4 book ai didi

java.util.Date 特殊日期 1980-04-06 : wrong hour

转载 作者:行者123 更新时间:2023-12-05 03:19:58 24 4
gpt4 key购买 nike

我们遇到了以下问题:

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", java.util.Locale.GERMAN);
String dateInString = "06-04-1980";
Date date = formatter.parse(dateInString);

之前:1980 年 4 月 6 日星期日 00:00:00 CEST

之后:1980 年 4 月 6 日星期日 01:00:00 CEST

另一个例子:

Date date = Date.from(LocalDate.of(1980, 4, 6).atStartOfDay(ZoneId.systemDefault()).toInstant());

面临同样的问题。

我们认为将 java11 更改为 java17 是问题所在,但事实并非如此。这是时区从欧洲/柏林到欧洲维也纳的变化。在 1980-04-06 夏令时在奥地利建立,时间更改为 00:00。所以这个日期没有 00:00。

可重现的示例 - 将时区更改为“欧洲/柏林”会在 0 小时内产生结果。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
for (LocalDate date = LocalDate.of(1500, 04, 01); date.isBefore(LocalDate.of(9999, 1, 1)); date = date.plusDays(1)) {
Date out = Date.from(date.atStartOfDay(ZoneId.of("Europe/Vienna")).toInstant());
Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone(ZoneId.of("Europe/Vienna")));
cal.setTime(out);
if (cal.get(Calendar.HOUR_OF_DAY) > 0) {
System.out.println(date.format(formatter) + " > " + cal.get(Calendar.HOUR_OF_DAY));
}
}
System.out.println("done");

1893-03-31 之前的所有日期在时区“欧洲/维也纳”中的小时数为 23,在“欧洲/柏林”中也是 0。

最佳答案

这不是真正的问题,这是关于时区“Europe/Vienna”的特殊问题,它在我们的系统中发生了变化。如果您遇到此问题,请检查您的时区,也许它已被其他一些属性更改。

虽然夏令时 (DST) 在该日期的德国从 02:00 开始,但在奥地利(欧洲/维也纳时区)已经从午夜开始,因此 00:00 时间不存在,这是为什么我们突然得到 01:00。两个时区都打印为 CEST(中欧夏令时),因此缩写不允许我们区分。

关于java.util.Date 特殊日期 1980-04-06 : wrong hour,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73315645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com