有没有办法创建JSR-310格式化程序,能够用可变长度的秒分数解析以下日期/时间?
2015-05-07 13:20:22.276052
或
2015-05-07 13:20:22.276
示例代码:
DateTimeFormatter formatter
= new java.time.format.DateTimeFormatterBuilder()
.append( java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") )
.appendOptional( java.time.format.DateTimeFormatter.ofPattern(".SSSSSS") )
.toFormatter();
formatter.parse("2015-05-07 13:20:22.276052", LocalDateTime::from);
答案 0 :(得分:39)
这解决了这个问题:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd HH:mm:ss")
.appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
.toFormatter();
System.out.println(LocalDateTime.parse("2015-05-07 13:20:22.276052", formatter));
System.out.println(LocalDateTime.parse("2015-05-07 13:20:22.276", formatter));
System.out.println(LocalDateTime.parse("2015-05-07 13:20:22", formatter));
// output
2015-05-07T13:20:22.276052
2015-05-07T13:20:22.276
2015-05-07T13:20:22
answer by JiriS不正确,因为它使用appendValue
,而正确的方法是使用DateTimeFormatterBuilder.appendFraction
(也处理小数点)。可以在第二个系统中看到差异,其中appendValue
错误地解析“2015-05-07T13:20:22.000276”。
解析时,LocalDateTime.parse(str, formatter)
比大多数情况下直接使用格式化程序更简洁。
使用builder时,请利用appendPattern()
和optionalStart()
来保持整洁。
答案 1 :(得分:0)
这个有用
DateTimeFormatter formatter
= new java.time.format.DateTimeFormatterBuilder()
.append( java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") )
.appendOptional(
new java.time.format.DateTimeFormatterBuilder()
.appendLiteral('.')
.appendValue( ChronoField.MICRO_OF_SECOND, 1, 6, SignStyle.NOT_NEGATIVE).toFormatter())
.toFormatter();