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

时间:2010-01-25 12:40:44

标签: java datetime parsing formatting

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

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

@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”

4 个答案:

答案 0 :(得分:12)

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

2010-01-25-14.17.47.307000

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

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

答案 1 :(得分:3)

除了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));

答案 2 :(得分:1)

TL;博士

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

使用java.time

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

这些旧类仅限于跟踪milliseconds,小数部分的三位数。现代java.time类解析为nanoseconds九个小数位数。

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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

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

答案 3 :(得分:0)

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

  

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