簡體   English   中英

DateTimeFormatter 無法按預期工作

[英]DateTimeFormatter doesn't work as expected

我必須將日期時間字符串轉換為分區日期時間 object。 我使用DateTimeFormatter來讀取模式。 根據文檔,模式中的“Z”可以接受如下格式:

  • +/- 0000
  • +/- 00:00

但是ZonedDateTime.parse(myDate, formatter)僅適用於第一種情況; 相反,在第二種情況下,代碼會生成異常。

Execution exception[[DateTimeParseException: Text '2020-06-22T16:00:00.000+00:00' could not be parsed at index 23]]

我正在使用 Java 8. 示例和代碼:

"2020-06-08T12:59:10.288+0000" **work**
"2020-06-08T12:59:10.288+00:00" **doesn't work**

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

ZonedDateTime dateConvertedUTC = ZonedDateTime.parse(dateTime, formatter);
LocalDateTime dateConverted = dateConvertedUTC.withZoneSameInstant(ZoneId.of("Europe/Rome")).toLocalDateTime();

我究竟做錯了什么? 謝謝!

您為時區指定了 Z,這就是 2020-06-08T12:59:10.288+0000 有效的原因。

但是如果你想解析 2020-06-08T12:59:10.288+00:00 你的格式必須是。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ");

您可以在 JavaDoc 中找到它:

偏移 Z:這會根據圖案字母的數量來格式化偏移。 一個、兩個或三個字母輸出小時和分鍾,不帶冒號,例如'+0130'。 當偏移量為零時,output 將為“+0000”。 四個字母輸出本地化偏移的完整形式,相當於四個字母的Offset-O。 如果偏移量為零,則 output 將是相應的本地化偏移量文本。 五個字母輸出小時、分鍾,如果非零,則可選秒,帶冒號。 如果偏移量為零,則輸出“Z”。 六個或更多字母會引發 IllegalArgumentException。

您確實需要為日期時間字符串2020-06-08T12:59:10.288+00:00定義格式。 它已經是 OffsetDateTime 的默認格式

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = OffsetDateTime.parse("2020-06-08T12:59:10.288+00:00");
        System.out.println(odt);

        // Get ZonedDateTime in the desired time-zone from OffsetDateTime
        ZonedDateTime zdt = odt.atZoneSameInstant(ZoneId.of("Europe/Rome"));

        // Get LocalDateTime from ZonedDateTime
        LocalDateTime ldt = zdt.toLocalDateTime();
        System.out.println(ldt);
    }
}

Output:

2020-06-08T12:59:10.288Z
2020-06-08T14:59:10.288

注意:ZonedDateTimeLocalDateTime的轉換會丟棄有價值的信息,即時區。 因此,只有當您確定您的業務邏輯不需要時區信息時,您才應該執行此轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM