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上的代码: