日期时间解析错误
Datetime parsing error
我在 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;
}
当我运行这个程序时,我得到以下输出。
Format is:yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'
Orignal Date: Fri Dec 22 03:45:15 UTC 2017
Orignal MS: 1513914315904
我不确定为什么它给了我 12 月 22 日 而它应该是 12 月 13 日。但是,如果我将输入日期更改为此。
String dateString = "2017-12-13T16:49:20.7Z";
即 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
直到 Z 之前的 3 个数字,它都会给我正确的输出。如果超过 3 个数字,我就会得到错误的输出。
如果有人能指出我在这里缺少的东西,那就太好了。
PS:我正在 android 中解析这些日期。我已将最低 API 等级设置为 16,java.time 不适用于 API 低于 26 的等级。
S
in 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);
}
}
我在 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;
}
当我运行这个程序时,我得到以下输出。
Format is:yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'
Orignal Date: Fri Dec 22 03:45:15 UTC 2017
Orignal MS: 1513914315904
我不确定为什么它给了我 12 月 22 日 而它应该是 12 月 13 日。但是,如果我将输入日期更改为此。
String dateString = "2017-12-13T16:49:20.7Z";
即 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
直到 Z 之前的 3 个数字,它都会给我正确的输出。如果超过 3 个数字,我就会得到错误的输出。
如果有人能指出我在这里缺少的东西,那就太好了。
PS:我正在 android 中解析这些日期。我已将最低 API 等级设置为 16,java.time 不适用于 API 低于 26 的等级。
S
in 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);
}
}