Java ZonedDateTime 不将 UTC 调整为本地时区
Java ZonedDateTime does not adjust UTC to local zone
这段代码:
String dateString = "20210811T021500Z";
String dateFormat = "yyyyMMdd'T'HHmmss'Z'";
System.out.println(LocalDateTime.parse(dateString, dateFormat).toString());
System.out.println(LocalDateTime.parse(dateString, dateFormat).atZone(ZoneId.of("Europe/Budapest")).toString());
System.out.println(ZonedDateTime.of(LocalDateTime.parse(dateString, dateFormat), ZoneId.of("Europe/Budapest")).toString());
输出这个:
2021-08-11T02:15
2021-08-11T02:15+02:00[Europe/Budapest]
2021-08-11T02:15+02:00[Europe/Budapest]
如何打印调整后的时间?我希望结果是 2021-08-11T04:15
.
您不应将日期解析为 LocalDateTime
。 LocalDateTime
没有关于时区的信息,但对于此处的计算,您绝对 需要 知道输入日期是 UTC,以便计算与 Europe/Budapest
.
改为将日期解析为 ZonedDateTime
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmssX");
ZonedDateTime zdt = ZonedDateTime.parse(dateString, formatter);
// zdt = 2021-08-11T02:15Z
请注意日期字符串中的 Z
并没有按字面意思解析为 'Z'
,而是解析为 X
- 时区偏移量。如果您按字面意思解析它,那么您的日期字符串中将没有时区信息。
然后,您可以通过调用 withZoneSameInstant
:
获得您想要的输出
System.out.println(
zdt.withZoneSameInstant(ZoneId.of("Europe/Budapest"))
); // 2021-08-11T04:15+02:00[Europe/Budapest]
或者,您可以将区域提供给格式化程序:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmssX")
.withZone(ZoneId.of("Europe/Budapest"));
ZonedDateTime zdt = ZonedDateTime.parse(dateString, formatter);
System.out.println(zdt);
2021-08-11T04:15+02:00[Europe/Budapest]
这段代码:
String dateString = "20210811T021500Z";
String dateFormat = "yyyyMMdd'T'HHmmss'Z'";
System.out.println(LocalDateTime.parse(dateString, dateFormat).toString());
System.out.println(LocalDateTime.parse(dateString, dateFormat).atZone(ZoneId.of("Europe/Budapest")).toString());
System.out.println(ZonedDateTime.of(LocalDateTime.parse(dateString, dateFormat), ZoneId.of("Europe/Budapest")).toString());
输出这个:
2021-08-11T02:15
2021-08-11T02:15+02:00[Europe/Budapest]
2021-08-11T02:15+02:00[Europe/Budapest]
如何打印调整后的时间?我希望结果是 2021-08-11T04:15
.
您不应将日期解析为 LocalDateTime
。 LocalDateTime
没有关于时区的信息,但对于此处的计算,您绝对 需要 知道输入日期是 UTC,以便计算与 Europe/Budapest
.
改为将日期解析为 ZonedDateTime
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmssX");
ZonedDateTime zdt = ZonedDateTime.parse(dateString, formatter);
// zdt = 2021-08-11T02:15Z
请注意日期字符串中的 Z
并没有按字面意思解析为 'Z'
,而是解析为 X
- 时区偏移量。如果您按字面意思解析它,那么您的日期字符串中将没有时区信息。
然后,您可以通过调用 withZoneSameInstant
:
System.out.println(
zdt.withZoneSameInstant(ZoneId.of("Europe/Budapest"))
); // 2021-08-11T04:15+02:00[Europe/Budapest]
或者,您可以将区域提供给格式化程序:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmssX")
.withZone(ZoneId.of("Europe/Budapest"));
ZonedDateTime zdt = ZonedDateTime.parse(dateString, formatter);
System.out.println(zdt);
2021-08-11T04:15+02:00[Europe/Budapest]