以下代码抛出 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
仅包含日期。
因此,您应该将LocalDate
与LocalDate#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
ZoneDateTime
或LocalDateTime
总是期望日期和时间的配对值。如果您没有时间值,但必须构建ZoneDateTime
或LocalDateTime
实例,则可以选择一些默认时间值,例如'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"(