簡體   English   中英

將字符串解析為特定格式的日期

[英]Parse string to date of specific format

我有一個格式如下的String stringDate = "2019-04-25T07:03:17.428Z"; 我需要將其轉換為格式為 2019-04-25 07:03:17 的 LocalDateTime object

我已經嘗試過LocalDateTime.parse(stringDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))但我得到了這個解析異常:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-04-25T07:03:17.428Z' could not be parsed at index 10
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
    at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
    at com.company.Main.main(Main.java:12)

轉換為特定格式的方法是什么?

你要求的(但不想要的)

    String stringDate = "2019-04-25T07:03:17.428Z";
    LocalDateTime ldt = LocalDateTime.parse(stringDate, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
            .truncatedTo(ChronoUnit.SECONDS);
    System.out.println(ldt);

Output 是

2019-04-25T07:03:17

它給了你你想要的東西,但正如rzwitserloot在另一個答案中指出的那樣,它沒有意義。 它忽略了字符串中的偏移量Z 偏移量對於將日期和時間解釋為時間點至關重要。 如果字符串是2019-04-25T07:03:17.428+13:00而不是,您仍然會得到相同的 output 即使該字符串表示一個時間點早於 13 小時。

truncatedTo()的調用擺脫了秒的小數部分。 如果你能忍受那幾分之一秒,那就不要打那個電話了。

你可能想要什么

為了更明智的轉換:

    ZoneId zone = ZoneId.of("Europe/Zagreb");
    
    Instant pointInTime = Instant.parse(stringDate);
    LocalDateTime ldt = pointInTime.atZone(zone)
            .toLocalDateTime()
            .truncatedTo(ChronoUnit.SECONDS);

    System.out.format("Date and time in %s: %s%n", zone, ldt);

歐洲/薩格勒布的日期和時間:2019-04-25T09:03:17

現在時間 07:03 UTC 已轉換為 09:03 中歐夏令時間。

編輯:如果您確實需要 UTC 中的LocalDateTime ,例如對於需要此的數據庫列,您可以通過這種方式在代碼中明確說明這一事實:

    LocalDateTime ldt = pointInTime.atOffset(ZoneOffset.UTC)
            .toLocalDateTime()
            .truncatedTo(ChronoUnit.SECONDS);

    System.out.format("Date and time in UTC: %s%n", ldt);

UTC 日期和時間:2019-04-25T07:03:17

你的代碼出了什么問題?

要了解您失敗的原因,讓我們看看您收到的異常消息:

無法在索引 10 處解析文本“2019-04-25T07:03:17.428Z”

索引 10 是表示時間部分開始的T所在的位置。 讓我們比較一下您的格式模式字符串: yyyy-MM-dd HH:mm:ss 這在時間部分之前有一個空格而不是T 這就是異常的原因。 如果您需要在模式中指定T必須存在,我們需要將其括在單引號中,例如yyyy-MM-dd'T'HH:mm:ss

從根本上說,您的輸入不是 LDT。 這是一個 ZDT - Z 是一個區域 (ZonedDateTime)。 因此,不可能將此字符串直接轉換為 LDT,這很好,因為這沒有任何意義。

將其轉換為 ZDT。 然后將轉換為 LDT。 這是一個單一的方法調用。

您可以先使用java.time.Instant解析它,然后使用java.time.LocalDateTime示例的Instant方法:

String stringDate = "2019-04-25T07:03:17.428Z";
var instant = Instant.parse(stringDate);
var localDateTime = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

暫無
暫無

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

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