Java SimpleDateFormat在2013年使用setLenient(false)

时间:2015-08-12 16:19:54

标签: java parsing simpledateformat

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

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)失败了? (Windows 7上的Java 7)

1 个答案:

答案 0 :(得分:2)

根据您的默认时区,由于daylight savings time.

的“提前”,该时刻可能不存在

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

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