DateTimeFormatter 为日期字符串抛出 DateTimeParseException



以下代码抛出 DateTimeParseException:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
ZonedDateTime dt = ZonedDateTime.parse(
"2019-01-01",
formatter.withZone(ZoneId.of("UTC"))
)

它还会引发异常

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
ZonedDateTime dt = ZonedDateTime.parse(
"2019-01-01",
formatter)
)

正如

DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
ZonedDateTime dt = ZonedDateTime.parse(
"2019-01-01",
formatter)
)

然而,SimpleDateFormat解析器工作得很好——我正在争论使用它,即使它不是线程安全的并且(我相信?(计划被弃用。

显然,我更喜欢使用 java.time API,但即使在在线遵循记录的示例之后,我也无法让这个东西工作。我该怎么办?

ZonedDateTime必须包含日期和时间;您的输入2019-01-01仅包含日期。

因此,您应该将LocalDateLocalDate#atTime(获取LocalDateTime对象(和LocalDateTime#atZone(ZoneOffset.UTC获取ZonedDateTime(结合使用。


var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
var zonedDateTime = LocalDate.parse("2019-01-01", formatter)
.atTime(1, 2, 3) // (hours, minutes, seconds)
.atZone(ZoneOffset.UTC);

zonedDateTime的值为:

2019-01-01T01:02:03Z

ZoneDateTimeLocalDateTime总是期望日期和时间的配对值。如果您没有时间值,但必须构建ZoneDateTimeLocalDateTime实例,则可以选择一些默认时间值,例如'00:00'并按以下步骤操作:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.parse("2019-01-01", formatter), LocalTime.MIN, ZoneId.of("UTC"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDateTime localDateTime = LocalDateTime.of(LocalDate.parse("2019-01-01", formatter), LocalTime.MIN);

注意:java.time.LocalTime有一些有用的时间常数MIN("00:00"(,MAX("23:59:59.9999999999"(,MIDNIGHT("00:00"(,NOON("12:00"(

相关内容

  • 没有找到相关文章

最新更新