SimpleDateFormat 在特定日期失败

SimpleDateFormat fails on particular date

在 java 1.8 上此代码失败

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
dateFormat.setLenient(false);
dateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
dateFormat.parse("03/11/2007 02:05:01");

有趣的是,03:05:01 解析正确

是的,那是因为 2007-03-11T02:05:01 从未出现在 America/New_York 时区。

spring-forward 夏令时更改发生在 2007-03-11T07:00:00Z,因此任何观看 time-zone-aware 时钟的人都会看到:

  • 01:59:58
  • 01:59:59
  • 03:00:00
  • 03:00:01

你已经告诉 SimpleDateFormat 严格处理输入,然后给它一个不存在的 date/time,所以它失败是合理的。

重要的是,无论您想如何处理这个问题,我都会强烈鼓励您摆脱遗留问题Date/Calendar/DateFormat 类型,并使用 java.time 代替。