为什么具有自定义 DateTimeFormatter 模式的 LocalDate 会错误地设置带时区的时间?
Why does LocalDate with custom DateTimeFormatter pattern incorrectly set the time with zone?
鉴于以下测试,我预计时间会相同,但事实并非如此。
@Test
public void canGetCorrectOffsetFromFormatterDateParse() {
Instant isoDateInstant = LocalDate.parse("2009-12-31",
DateTimeFormatter.ISO_DATE)
.atStartOfDay(ZoneId.systemDefault())
.toInstant();
System.out.println(isoDateInstant);
assertThat(isoDateInstant).isEqualTo("2009-12-31T05:00:00Z");
Instant customDateInstant = LocalDate.parse("03-31-2020",
DateTimeFormatter.ofPattern("MM-dd-uuuu")
.withResolverStyle(ResolverStyle.STRICT))
.atStartOfDay(ZoneId.systemDefault())
.toInstant();
System.out.println(customDateInstant);
assertThat(customDateInstant).isEqualTo("2020-03-31T05:00:00Z");
}
此测试因 customeDateInstance 的断言而失败
Expected :2020-03-31T05:00:00Z
Actual :2020-03-31T04:00:00Z
问:为什么追加的时间不一样,我该如何标准化向前的时间部分?
这些测试是在美国弗吉尼亚州 运行 进行的,即 America/New_York ZoneId。
由于 DST,America/New_York
在“冬天”是 GMT-5,在“夏天”是 GMT-4。
2020 年:
- “冬天”到“夏天”是 3 月 8 日星期日,2:00 上午,
- “夏季”到“冬季”是 11 月 1 日星期日 2:00 上午。
不出所料,您的代码随后:
- 给出
2020-03-05T05:00:00Z
和 03-05-2020
(“冬天”),
- 用
03-15-2020
(“夏天”)给出 2020-03-15T04:00:00Z
。
鉴于以下测试,我预计时间会相同,但事实并非如此。
@Test
public void canGetCorrectOffsetFromFormatterDateParse() {
Instant isoDateInstant = LocalDate.parse("2009-12-31",
DateTimeFormatter.ISO_DATE)
.atStartOfDay(ZoneId.systemDefault())
.toInstant();
System.out.println(isoDateInstant);
assertThat(isoDateInstant).isEqualTo("2009-12-31T05:00:00Z");
Instant customDateInstant = LocalDate.parse("03-31-2020",
DateTimeFormatter.ofPattern("MM-dd-uuuu")
.withResolverStyle(ResolverStyle.STRICT))
.atStartOfDay(ZoneId.systemDefault())
.toInstant();
System.out.println(customDateInstant);
assertThat(customDateInstant).isEqualTo("2020-03-31T05:00:00Z");
}
此测试因 customeDateInstance 的断言而失败
Expected :2020-03-31T05:00:00Z
Actual :2020-03-31T04:00:00Z
问:为什么追加的时间不一样,我该如何标准化向前的时间部分?
这些测试是在美国弗吉尼亚州 运行 进行的,即 America/New_York ZoneId。
由于 DST,America/New_York
在“冬天”是 GMT-5,在“夏天”是 GMT-4。
2020 年:
- “冬天”到“夏天”是 3 月 8 日星期日,2:00 上午,
- “夏季”到“冬季”是 11 月 1 日星期日 2:00 上午。
不出所料,您的代码随后:
- 给出
2020-03-05T05:00:00Z
和03-05-2020
(“冬天”), - 用
03-15-2020
(“夏天”)给出2020-03-15T04:00:00Z
。