日期时间解析错误

Waq*_*med 2 java datetime android datetime-parsing

我在Java中解析日期时遇到问题.下面是代码.

 String dateString = "2017-12-13T16:49:20.730555904Z";
 List<String> formatStrings = Arrays.asList("yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'");

    for (String formatString : formatStrings)
    {
        try
        {
            SimpleDateFormat formatter = new SimpleDateFormat(formatString);
            formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
            Date d = formatter.parse(dateString);
            System.out.println("Format is:" + formatString);
            System.out.println("Orignal Date: " + d);
            System.out.println("Orignal MS: " + d.getTime());

            return d;
        }
        catch (ParseException e) {}
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个程序时,我得到以下输出.

Format is:yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'
Orignal Date: Fri Dec 22 03:45:15 UTC 2017
Orignal MS: 1513914315904
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它是给我12月22日当它应该是12月13日.但是,如果我将输入日期更改为此.

String dateString = "2017-12-13T16:49:20.7Z";
Run Code Online (Sandbox Code Playgroud)

即在Z之前只有一个字符.然后我得到正确的输出.

Format is:yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'
Orignal Date: Wed Dec 13 16:49:20 UTC 2017
Orignal MS: 1513183760007
Run Code Online (Sandbox Code Playgroud)

它给了我正确的输出,直到Z之前的3个数字.如果超过3个数字比我得到错误的输出.

如果有人能指出我在这里缺少的东西,那就太好了.

PS:我在android中解析这些日期.我已将min API级别设置为16,并且java.time不适用于26级以下的API级别.

Jon*_*eet 12

Sin SimpleDateFormat指定了毫秒数,而不是一小部分.您已指定730555904毫秒,即约8.45天 - 因此日期更改.

java.util.Date只有毫秒的精度.我建议使用这个java.time包,它的精度为纳秒,就像输入一样.使用DateTimeFormatter解析.注意,在中DateTimeFormatter,说明S一秒的分数.

更好的是,Instant.parse无论如何都使用正确的格式:

import java.time.*;

public class Test {
    public static void main(String... args) throws Exception {
        String text = "2017-12-13T16:49:20.730555904Z";
        Instant instant = Instant.parse(text);
        System.out.println(instant);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,ThreeTenABP,请参阅[如何在Android项目中使用ThreeTenABP](/sf/ask/2724592811/). (2认同)