gpt4 book ai didi

java - 宽松的 Java 8 日期解析

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:24 24 4
gpt4 key购买 nike

我想用 LocalDateTime 解析“2015-10-01”。我要做的是

LocalDate localDate = LocalDate.parse('2015-10-01');
LocalDateTime localDateTime = localDateTime.of(localDate, LocalTime.MIN);

但我想一次性解析它

// throws DateTimeParseException
LocalDateTime date = LocalDateTime.parse('2015-10-01', DateTimeFormatter.ISO_LOCAL_DATE);

字符串的微小差异也会引发异常。

// throws DateTimeParseException
LocalDate localDate = LocalDate.parse("2015-9-5", DateTimeFormatter.ISO_LOCAL_DATE);

我可以使用 Java 8 日期 API 轻松地解析日期字符串吗?

最佳答案

如果要将日期字符串解析为 "2015-10-01""2015-9-5"LocalDateTime 对象,您可以使用 DateTimeFormatterBuilder 构建您自己的 DateTimeFormatter:

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:

The parser for a variable width value such as this normally behaves greedily, requiring one digit, but accepting as many digits as possible.

这意味着它将能够解析格式为 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));

关于java - 宽松的 Java 8 日期解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32962417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com