无法解析自定义日期格式。 (JAVA)

我必须在Java中使用自定义日期格式。 它包含微秒,尽管Java不支持微秒。 因为我用零填充时间模式,格式化时工作正常,但我不能用该模式解析日期字符串。

有一个简单的解决方法或我必须自己处理微秒(使用字符串函数)?

@Test public void testDateFormat() throws ParseException { DateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSS000"); String theDate = format.format(new Date()); // this will fail: format.parse(theDate); } 

java.text.ParseException:无法解析的日期:“2010-01-25-12.40.35.769000”

您的问题是,SimpleDateFormat中使用的模式具有不同的含义,具体取决于它是用作解析器还是用作格式化程序。 作为格式化程序,您的模式执行预期的操作,输出将以毫秒值结束,格式为三位数后跟三个0字符,例如:

2010-01-25-14.17.47.307000

然而,用作解析器时,“SSS”模式将匹配任意数量的数字,并将上述示例解析为307000 ms。 在解析了ms字段之后,解析器仍将查找“000”子字符串并因exception而失败,因为您已到达输入字符串的末尾,而未满足模式的要求。

由于SimpleDateFormat中没有μs值的模式,因此在将其提供给SimpleDateFormat之前,您必须编写自己的包装器以剥离最后三个0字符的输入字符串。

除了jarnbjo的答案,如果你需要微秒,你可能可以使用java.sql.Timestamp:

 Date dateToMillis = format.parse(theDate.substring(0, 23)); DateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Timestamp timestamp = Timestamp.valueOf(timestampFormat.format(dateToMillis) + theDate.substring(23,26)); 

TL;博士

 LocalDateTime.parse( "2010-01-25-12.40.35.769000" , DateTimeFormatter.ofPattern( "uuuu-MM-dd-HH.mm.ss.SSSSSS" ) ) 

使用java.time

您正在使用现在遗留的麻烦的旧日期时间类,取而代之的是java.time类。

这些旧类仅限于跟踪毫秒 ,小数部分的三位数。 现代java.time类解析为纳秒级 ,小数部分的位数。

 DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd-HH.mm.ss.SSSSSS" ) ; LocalDateTime ldt = LocalDateTime.parse( "2010-01-25-12.40.35.769000" ); 

ldt.toString():2010-01-25T12:40:35.769

ISO 8601

提示:不是发明自己的格式以文本方式表示日期时间值,而是坚持使用标准的ISO 8601格式。

默认情况下,java.time类使用标准格式。 您可以在上面的输出中看到该格式。 T将日期部分与时间部分分开。


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

在零周围添加一个'' ,如下所示: "yyyy-MM-dd-HH.mm.ss.SSS'000'"

日期和时间格式由日期和时间模式字符串指定。 在日期和时间模式字符串中,从“A”到“Z”和从“a”到“z”的不带引号的字母被解释为表示日期或时间字符串的组成部分的模式字母。 可以使用单引号(’)引用文本以避免解释。 “””代表单引号。 不解释所有其他字符; 它们只是在格式化过程中被复制到输出字符串中,或​​者在解析过程中与输入字符串匹配。