为什么具有自定义 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。

由于 DSTAmerica/New_York 在“冬天”是 GMT-5,在“夏天”是 GMT-4。

2020 年:

  • “冬天”到“夏天”是 3 月 8 日星期日,2:00 上午,
  • “夏季”到“冬季”是 11 月 1 日星期日 2:00 上午。

不出所料,您的代码随后:

  • 给出 2020-03-05T05:00:00Z03-05-2020(“冬天”),
  • 03-15-2020(“夏天”)给出 2020-03-15T04:00:00Z