SimpleDateFormat 没有正确解析时间

SimpleDateFormat not parsing time correctly

这发生在一个(可能更多)日期时间,其中时间部分在解析中完全错误。

代码:

import java.text.*;
import java.util.*;

public class TestTimeParse {
    public static void main(String[] args) {
        SimpleDateFormat dateFmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.getDefault());
        dateFmt.applyPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'");
        ParsePosition pos = new ParsePosition(0);
        Date date = dateFmt.parse("2018-11-01T18:07:55.6725292Z", pos);
        System.out.println("Text 2018-11-01T18:07:55.6725292Z parses as " + date);
    }
}

输出:

Text 2018-11-01T18:07:55.6725292Z parses as Thu Nov 01 20:00:00 MDT 2018

时间部分发生了什么?小时错误,分秒归零。

这是 one of the problems 以及已过时的 DateCalendarSimpleDateFormat 类。您不应该使用它,因为它已被 Java 8 中的新日期和时间 API 取代。它在 java.time 包中可用。

String str = "2018-11-01T18:07:55.6725292Z";
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'";

LocalDateTime ts = LocalDateTime.parse(str, DateTimeFormatter.ofPattern(pattern));
System.out.println("Text 2018-11-01T18:07:55.6725292Z parses as " + ts);

SimpleDateFormat 似乎最多只能读取三毫秒数字。如果将日期的小数部分截断为三位数,即“2018-11-01T18:07:55.672”而不是“2018-11-01T18:07:55.6725292Z”,并且还更改相应的 'S' 模式说明符,即 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'".