我必须在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”
答案 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)
LocalDateTime.parse(
"2010-01-25-12.40.35.769000" ,
DateTimeFormatter.ofPattern( "uuuu-MM-dd-HH.mm.ss.SSSSSS" )
)
你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是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格式。
默认情况下,java.time类使用标准格式。您可以在上面的输出中看到该格式。 T
将日期部分与时间部分分开。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 3 :(得分:0)
在零周围添加''
,如下所示:"yyyy-MM-dd-HH.mm.ss.SSS'000'"
日期和时间格式由。指定 日期和时间模式字符串。内 日期和时间模式字符串, 从'A'到'Z'和。的不带引号的字母 从'a'到'z'被解释为 代表的模式字母 日期或时间字符串的组成部分。 可以使用单引号引用文本 (')以避免解释。 “‘’” 代表单引号。所有其他 字符不被解释; 它们只是复制到输出中 格式化或匹配时的字符串 在输入字符串期间 解析。