[英]DateTimeFormatter doesn't work as expected
我必須將日期時間字符串轉換為分區日期時間 object。 我使用DateTimeFormatter來讀取模式。 根據文檔,模式中的“Z”可以接受如下格式:
但是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
注意:從ZonedDateTime
到LocalDateTime
的轉換會丟棄有價值的信息,即時區。 因此,只有當您確定您的業務邏輯不需要時區信息時,您才應該執行此轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.