在Java中解析微秒的时间

我在解析Java中的时间字符串时出现问题,格式为2013-01-09 09:15:03.000000 。 在我的数据中,最后三位数始终为0(意味着输入字符串只有毫秒精度),因此我将此格式传递给SimpleDateFormat:

 formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS'000'"); 

但是formatter.parse("2013-01-09 09:15:02.500000"); 抛出exception:

 Unparseable date: "2013-01-09 09:15:02.500000" at java.text.DateFormat.parse(DateFormat.java:357) 

谁知道如何正确地做到这一点? 我可以通过使用格式yyyy-MM-dd HH:mm:ss.SSS并使用substring来摆脱最后三位数,但这真的很糟糕。

编辑:任何人都可以解释为什么格式字符串yyyy-MM-dd HH:mm:ss.SSS'000'不能用于解析时间"2013-01-09 09:15:02.500000"

尝试java.sql.Timestamp

  Timestamp ts = Timestamp.valueOf("2013-01-09 09:15:03.500000"); Date date = new Date(ts.getTime()) 

与SimpleDateFormat相比,它也是线程安全且快速的

我已经弄明白了。 仅供参考,Apache commons的FastDateFormat似乎接受SSS000格式并正确解析时间。

java.time

我想提出现代的答案。 使用java.time ,现代Java日期和时间API。 一种选择,您可以使用格式化程序:

  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS"); LocalDateTime dateTime = LocalDateTime.parse(timeString, formatter); System.out.println(dateTime); 

当您使用问题"2013-01-09 09:15:02.500000"的字符串时,打印出来:

 2013-01-09T09:15:02.500 

如果您希望在秒数上打印六位小数值,即使最后三位小数为0,也可以使用相同的格式化程序将时间格式化为字符串:

  System.out.println(dateTime.format(formatter)); 

另一种选择,你可以利用你的字符串类似于ISO 8601格式的事实,即现代类解析为默认格式,即没有任何明确的格式化程序。 只有ISO 8601有一个T来表示时间部分的开始,但我们可以轻松解决这个问题:

  LocalDateTime dateTime = LocalDateTime.parse(timeString.replace(' ', 'T')); 

它给出了相同的结果, 2013-01-09T09:15:02.500 。 它更短,但也更棘手。

何必?

DateTimestamp类已经过时了,特别是SimpleDateFormat已经certificate很麻烦。 它在你的情况下令人惊讶的行为只是一个小故事中的很多。 现代API通常可以更好地使用。

你的格式化器为什么不工作?

虽然SimpleDateFormatDateTimeFormatter使用的格式模式字符串相似,但存在差异。 一个是SimpleDateFormat将大SimpleDateFormat S理解为毫秒,无论它们中有一个或九个,而对于DateTimeFormatter它们意味着秒的分数。 你的SimpleDateFormat进一步抓住了小数点后的所有六位数,忽略了你只键入三个S的事实,所以没有剩下的零来匹配'000' (顺便说一句,撇号不是必需的,只有字母需要它们)。

链接

Oracle教程