1

这段代码:

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.

4

1 回答 1

7

您不应将日期解析为LocalDateTime. ALocalDateTime没有关于时区的信息,但是对于您在这里的计算,您绝对需要知道输入日期是 UTC,以便计算与Europe/Budapest.

将日期解析为 a 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]
于 2021-08-11T00:49:08.590 回答