SimpleDateFormat 在特定日期失败

Igo*_*iwi 4 java simpledateformat

在 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");
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 13

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

春季夏令时更改发生在 2007-03-11T07:00:00Z,因此任何观看时区感知时钟的人都会看到:

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

您已经告诉SimpleDateFormat严格处理输入,然后给它一个不存在的日期/时间,所以它失败是合理的。

重要的是,无论您想如何处理这个问题,我都强烈鼓励您放弃旧的Date//类型,并改用Calendar它。DateFormatjava.time