亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ISO_DATE_TIME.format() 到具有可選偏移量的 LocalDateTime

ISO_DATE_TIME.format() 到具有可選偏移量的 LocalDateTime

智慧大石 2023-06-14 11:14:08
我正在嘗試將 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?. 我想避免一些字符串解析(檢查字符串是否包含“+”/“-”)。
查看完整描述

2 回答

?
慕森王

TA貢獻1777條經驗 獲得超3個贊

您可以構建一個帶有可選偏移量元素的解析器,并使用 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);


查看完整回答
反對 回復 2023-06-14
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

您可以在子句中處理解析異常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);

}


查看完整回答
反對 回復 2023-06-14
  • 2 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號