使用Java 8 DateTime API解析日期和AM / PM

我正在尝试使用Java 8 DateTime API解析日期时间字符串。

要解析的字符串包含日期,月份,年份和AM / PM标记,例如17/02/2015 PM。我使用以下模式:dd/MM/yyyy

aa并且我希望将解析的LocalDateTime时间部分设置为AM / PM标记12:00:0000:00:00取决于AM / PM标记。

使用以前的java.text.SimpleDateFormatAPI,解析可以使用此模式按预期进行。

但是当我使用Java 8 DateTime API并运行以下代码时:

LocalDateTime.parse("17/02/2015 PM", DateTimeFormatter.ofPattern("dd/MM/yyyy aa"));

我得到以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: Too many pattern letters: a

at java.time.format.DateTimeFormatterBuilder.parseField(DateTimeFormatterBuilder.java:1765)

at java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1604)

at java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1572)

at java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:534)

如果我将模式切换为,dd/MM/yyyy a则出现以下异常:

Exception in thread "main" java.time.format.DateTimeParseException: Text '17/02/2015 PM' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {AmPmOfDay=1},ISO resolved to 2015-02-17 of type java.time.format.Parsed

at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)

at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)

at java.time.LocalDateTime.parse(LocalDateTime.java:492)

Caused by: java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: {AmPmOfDay=1},ISO resolved to 2015-02-17 of type java.time.format.Parsed

at java.time.LocalDateTime.from(LocalDateTime.java:461)

at java.time.LocalDateTime$$Lambda$7/474675244.queryFrom(Unknown Source)

at java.time.format.Parsed.query(Parsed.java:226)

at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)

... 2 more

Caused by: java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {AmPmOfDay=1},ISO resolved to 2015-02-17 of type java.time.format.Parsed

at java.time.LocalTime.from(LocalTime.java:409)

at java.time.LocalDateTime.from(LocalDateTime.java:457)

... 5 more

同样奇怪的是,当我执行反向操作format时,它运行良好:

 System.out.println(LocalDateTime.of(2015, 02, 17, 0, 0, 0).format(DateTimeFormatter.ofPattern("dd/MM/yyyy a")));

System.out.println(LocalDateTime.of(2015, 02, 17, 12, 0, 0).format(DateTimeFormatter.ofPattern("dd/MM/yyyy a")));

分别打印17/02/2015 AM17/02/2015 PM

的javadoc java.time.DateTimeFormatter说(§Resolving,步骤#6):

  1. 如果每天至少有一个小时可用,则会形成LocalTime。这涉及提供分钟,秒和秒的默认值。

我了解的是,必须每天使用小时字段来解析LocalDateTime …仅使用AM / PM字段来解析时间部分是没有办法吗?

回答:

您可以通过DateTimeFormatterBuilder.parseDefaulting以下方式为不可用字段设置默认值:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()

.appendPattern("dd/MM/yyyy a")

.parseDefaulting(ChronoField.HOUR_OF_AMPM, 0) // this is required

.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) // optional, but you can set other value

.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) // optional as well

.toFormatter();

System.out.println(LocalDateTime.parse("17/02/2015 PM", formatter)); // 2015-02-17T12:00

System.out.println(LocalDateTime.parse("17/02/2015 AM", formatter)); // 2015-02-17T00:00

以上是 使用Java 8 DateTime API解析日期和AM / PM 的全部内容, 来源链接: utcz.com/qa/409087.html

回到顶部