Java SimpleDateFormat 不会使用 setLenient(false) 解析 2013 年的特定时间

Java SimpleDateFormat won't parse a specific time in 2013 with setLenient(false)

好的,所以我有一个非常具体的错误,我想知道是否有人知道为什么会这样。这是代码

public static void main(String[] args) {
  String time = "2013-03-10 02:59:26";
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  formatter.setLenient(false);
  Date modDate;
  try {
    System.out.println("Date String: " + time);
    modDate = formatter.parse(time);
  } catch (ParseException e) {
    System.out.println("Date String: " + time);
  e.printStackTrace();
}

因此,仅当年份为 2013 年、月份为 3 月 (03) 日为 10 日、时间为 02 小时且分钟在 50 年代的任何位置时,此代码才会引发无法解析的错误。我正在解析一些以毫秒为单位记录的日志文件,所以在这个时间范围内有很多,并且由于某种原因它只在日志文件中的那十分钟抛出一个无法解析的错误。我试过调查所有事情,对我来说这看起来像是一次真正的约会。解决它的一件事是 setLenient(true);但我想知道为什么 setLenient(false) 会失败? (Java 7 在 Windows 7)

根据您的默认时区,该时刻可能不存在,因为 daylight savings time.

的 "spring ahead"

美国实行夏令时的地区从三月的第二个星期天早上开始,跳过当地时间凌晨 2 点到凌晨 3 点之间的时间。因为时钟从01:59:59变为03:00:00,所以那天没有02:59:59。

您的日志文件中的字符串代表时间的瞬间;在内部,这些瞬间存储为自 1970 年以来的毫秒数,UTC。 那是 您在解析字符串时想要重建的值。 (Date 实例只是这个数字的包装器,不包含有关本地时区等的任何信息。)您应该能够通过将解析器设置为相同的时区来恢复原始日期在记录时格式化日期时使用。