【问题标题】:DateTimeFormatter throws DateTimeParseException for date stringDateTimeFormatter 为日期字符串抛出 DateTimeParseException
【发布时间】:2019-10-21 20:07:28
【问题描述】:

以下代码抛出 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 也需要时间部分,
  • ZonedDateTime dt = LocalDate.parse("2019-01-01", formatter).atTime(LocalTime.of(0,0,0)).atZone(ZoneId.of("UTC"))
  • 你为什么认为你想要ZonedDateTime?对于日期使用LocalDate。对于 UTC 的日期和时间,请使用 Instant,或者如果您坚持使用 OffsetDateTime

标签: java datetime-format java-time


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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.999999999')、MIDNIGHT('00:00')、NOON('12:00')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 2020-04-24
      • 2020-09-06
      • 2012-07-09
      • 1970-01-01
      相关资源
      最近更新 更多