【问题标题】:ISO_DATE_TIME.format() to LocalDateTime with optional offsetISO_DATE_TIME.format() 到带有可选偏移量的 LocalDateTime
【发布时间】:2019-12-24 19:29:12
【问题描述】:

我正在尝试将 ISO 日期时间转换为 LocalDateTime:

String timezone = "Pacific/Apia";
String isoDateTime = "2011-12-03T10:15:30+03:00";
var zoned = ZonedDateTime.from(ISO_DATE_TIME_FORMATTER.parse(isoDateTime));
return zoned.withZoneSameInstant(ZoneId.of(timeZone)).toLocalDateTime();

此代码有效 - 它将其转换为本地日期,包括偏移量。但问题是当我通过没有偏移的日期时:2011-12-03T10:15:30 -

java.time.DateTimeException: 无法从 TemporalAccessor: {} 获取 ZonedDateTime,ISO 解析为 java.time.format.Parsed 类型的 2011-12-03T10:15:30

我知道为什么会出现这个异常,问题是如何将包括偏移量在内的两个日期转换为 LocalDateTime?。我想避免一些字符串解析(检查字符串是否包含'+'/'-')。

【问题讨论】:

    标签: java localdate


    【解决方案1】:

    您可以在catch 子句中处理解析异常并尝试不同的解析器。比如这样:

    String timezone = "Pacific/Apia"
    String isoDateTime = "2011-12-03T10:15:30+03:00";    
    try{
        var zoned = ZonedDateTime.from(ISO_DATE_TIME_FORMATTER.parse(isoDateTime));
        return zoned.withZoneSameInstant(ZoneId.of(timeZone)).toLocalDateTime();
    } catch (DateTimeException e) {
        //no time zone information -> parse as LocalDate
        return LocalDateTime.parse(isoDateTime);
    }
    

    【讨论】:

    • 这是一个非常好的答案,但有些绕路。如果没有更好的解决方案,我会接受这个答案:) 谢谢@leonardkraemer
    【解决方案2】:

    您可以使用可选的偏移元素构建解析器,并使用 TemporalAccessor.isSupported 来检查偏移是否存在。

        DateTimeFormatter parser = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
            .optionalStart()
            .appendOffsetId()
            .optionalEnd()
            .toFormatter();
    
        TemporalAccessor accessor = parser.parse(isoDateTime);
        if (accessor.isSupported(ChronoField.OFFSET_SECONDS)) {
            var zoned = ZonedDateTime.from(accessor);
            return zoned.withZoneSameInstant(ZoneId.of(timezone)).toLocalDateTime();
        }
        return LocalDateTime.from(accessor);
    

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多