Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleDataFormat解析结果是奇数_Java_Date - Fatal编程技术网

Java SimpleDataFormat解析结果是奇数

Java SimpleDataFormat解析结果是奇数,java,date,Java,Date,我想解析文件系统中的日期,并以以下格式获取它们: 2013-07-29 14:49:53.813588954 +0200 所以我的模式是这样的 yyyy-MM-dd HH:mm:ss.SSSSSSSSS Z 最后是我的代码: String rawDate = "2013-07-29 14:49:53.813588954 +0200"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSSSS Z")

我想解析文件系统中的日期,并以以下格式获取它们:

2013-07-29 14:49:53.813588954 +0200
所以我的模式是这样的

yyyy-MM-dd HH:mm:ss.SSSSSSSSS Z
最后是我的代码:

String rawDate = "2013-07-29 14:49:53.813588954 +0200";

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSSSS Z");
Date date = sdf.parse(rawDate);

SimpleDateFormat out = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String parsedDate = out.format(date);

System.out.println(rawDate + " -> " + parsedDate);
但我的输出如下所示:

2013-07-29 14:49:53.813588954 +0200 -> 2013-08-08 00:49:41.000000954 +0200

我甚至尝试了
setLenient(false)
,但后来我得到了一个ParseException。

您已将813588954解析为毫秒数-这超过了9天,并将其添加到2013-07-29 14:49:53

基本上,
SimpleDataFormat
不处理纳秒级的解析,而且
java.util.Date
只支持毫秒级的精度

如果您可以使用Java8,我建议您对所有内容都使用
Java.time
——不要使用
Java.util.Date
。如果您可以使用
java.time
进行解析,但必须使用
java.util.Date
进行其余的解析,那么这至少会有所帮助


如果您根本不能使用Java 8,我建议手动修改字符串,将纳秒截断为毫秒,然后使用
SimpleDataFormat
使用
.SSS

的模式进行解析。您已经将813588954解析为毫秒数-这超过了9天,并将其添加到2013-07-29 14:49:53

基本上,
SimpleDataFormat
不处理纳秒级的解析,而且
java.util.Date
只支持毫秒级的精度

如果您可以使用Java8,我建议您对所有内容都使用
Java.time
——不要使用
Java.util.Date
。如果您可以使用
java.time
进行解析,但必须使用
java.util.Date
进行其余的解析,那么这至少会有所帮助


如果您根本不能使用Java 8,我建议手动修改字符串,将纳秒截断为毫秒,然后使用
SimpleDataFormat
使用
.SSS

的模式进行解析,因为
53.813588954
意味着53秒和813588954毫秒,813588954毫秒大约是9天。在对第二个输出(即
parsedDate
)进行格式化时,Java会自动按秒->分钟->小时->天->月->年的顺序进行取整。

因为
53.813588954
表示53秒,813588954毫秒,813588954毫秒约为9天。在对第二个输出(即
parsedDate
)进行格式化时,Java会自动按秒->分钟->小时->天->月->年的顺序进行取整。

Java 8的DateTimeFormatter支持纳秒级的解析。为此,您需要更新您的模式:

String rawDate = "2013-07-29 14:49:53.813588954 +0200";
DateTimeFormatter rawDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnnnn Z");
ZonedDateTime zonedDateTime = ZonedDateTime.parse(rawDate, rawDateFormatter);
System.out.println(zonedDateTime); // prints 2013-07-29T14:49:53.813588954+02:00

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
System.out.println(zonedDateTime.format(formatter)); // prints 2013-07-29 14:49

Java8的DateTimeFormatter支持纳秒级的解析。为此,您需要更新您的模式:

String rawDate = "2013-07-29 14:49:53.813588954 +0200";
DateTimeFormatter rawDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnnnn Z");
ZonedDateTime zonedDateTime = ZonedDateTime.parse(rawDate, rawDateFormatter);
System.out.println(zonedDateTime); // prints 2013-07-29T14:49:53.813588954+02:00

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
System.out.println(zonedDateTime.format(formatter)); // prints 2013-07-29 14:49

我执行了你的代码。我得到输出:2013-07-29 14:49:53.813588954+0200->2013-08-08 04:19(我想这是预期的)。你确定输出吗?你在ideone上的代码:我执行了你的代码。我得到输出:2013-07-29 14:49:53.813588954+0200->2013-08-08 04:19(我想这是预期的)。你确定输出吗?您在ideone上的代码: