如果你想解析日期字符串作为"2015-10-01"
和"2015-9-5"
到LocalDateTime
对象,你可以建立自己DateTimeFormatter
使用DateTimeFormatterBuilder
:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy")
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH)
.parseDefaulting(HOUR_OF_DAY, HOUR_OF_DAY.range().getMinimum())
.parseDefaulting(MINUTE_OF_HOUR, MINUTE_OF_HOUR.range().getMinimum())
.parseDefaulting(SECOND_OF_MINUTE, SECOND_OF_MINUTE.range().getMinimum())
.parseDefaulting(NANO_OF_SECOND, NANO_OF_SECOND.range().getMinimum())
.toFormatter();
System.out.println(LocalDateTime.parse("2015-9-5", formatter));
System.out.println(LocalDateTime.parse("2015-10-01", formatter));
每个字段的可变长度由调用appendValue(field)
处理。引用Javadoc:
像这样的可变宽度值的解析器通常表现得很贪婪,需要一位数字,但接受尽可能多的数字。
这意味着它将能够解析用1或2位数字格式化的月份和日期。
要构建一个LocalDateTime
,我们还需要为此构建器提供一个LocalTime
。这是通过对LocalTime
的每个字段使用parseDefaulting(field, value)
来完成的。如果该字段不存在于要解析的字符串中,则此方法为该字段提供一个字段和一个默认值。由于在我们的情况下,时间信息不会出现在字符串中,因此将选择默认值,即该字段的有效值范围的最小值(通过调用getMinimum
来获得该字段的ValueRange
;也许我们也可以在这里硬编码0)。
在事件解析可能包含时间信息的字符串,我们可以使用的DateTimeFormatter
可选部分,像这样:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy")
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH)
.appendPattern("[ HH:mm]") // optional sections are surrounded by []
.parseDefaulting(HOUR_OF_DAY, HOUR_OF_DAY.range().getMinimum())
.parseDefaulting(MINUTE_OF_HOUR, MINUTE_OF_HOUR.range().getMinimum())
.parseDefaulting(SECOND_OF_MINUTE, SECOND_OF_MINUTE.range().getMinimum())
.parseDefaulting(NANO_OF_SECOND, NANO_OF_SECOND.range().getMinimum())
.toFormatter();
System.out.println(LocalDateTime.parse("2015-9-5", formatter));
System.out.println(LocalDateTime.parse("2015-10-01", formatter));
System.out.println(LocalDateTime.parse("2015-1-1 10:10", formatter));
我对不起,请仔细阅读这个问题。我没有问这个用法。 –