簡體   English   中英

Java:將多個字符串日期時間格式解析為 LocalDateTime/Date/Calender

[英]Java: Parse multiple String Date Time format into LocalDateTime/Date/Calender

我正在嘗試將字符串日期時間解析為 Java 中的LocalDateTimeDate 我可能會得到輸入 像12/21/2020 12:12:12 PM , 1/12/2020 2:6:8 PM , 10/2/2020 10:50:8 AM

我嘗試在可以工作的DateTimeFormatterDateTimeFormatBuilder下使用不同類型的模式。 蠻力方法我在哪里 硬編碼不同的模式組合 這是從鏈接復制的代碼:

import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;

class Main {
    public static void main(String[] args) {
        // many combinations
        final String DATE_FORMATS = "[MM/dd/yyyy HH:mm:ss a][M/dd/yyyy H:mm:ss a]";
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(DATE_FORMATS);

        System.out.println(dateFormatter.parse("12/21/2020 11:12:12 AM"));
        System.out.println(dateFormatter.parse("1/12/2020 2:54:55 AM"));
    }
}

有沒有其他解決方案,因為我無法控制輸入? 我可以在Formatter使用哪個模式而不是多個組合? 或者在解析之前接收后修改輸入更好嗎?

tl;博士

LocalDateTime.parse(dateTimeString, DateTimeFormatter.ofPattern("M/d/yyyy h:m:sa");
足以滿足您所有的日期時間示例。


以下示例能夠通過使用LocalDateTime.parse而不是DateTimeFormatter.parse來解析所有示例 datetime String s,它們是不同的:

public static void main(String[] args) {
    String first = "12/21/2020 12:12:12 PM";
    String second = "1/12/2020 2:6:8 PM";
    String third = "10/2/2020 10:50:8 AM";

    DateTimeFormatter dtf = DateTimeFormatter
            .ofPattern("[MM/dd/yyyy HH:mm:ss a][M/dd/yyyy h:m:s a][MM/d/yyyy HH:mm:s a]");

    System.out.println(LocalDateTime.parse(first, dtf));
    System.out.println(LocalDateTime.parse(second, dtf));
    System.out.println(LocalDateTime.parse(third, dtf));
}

看一下使用的第二個/中間模式,它使用h (小寫)表示小時而不是H (大寫),因為一天的 AM/PM 也將從大寫H派生,這將導致在第二個日期時間樣本"1/12/2020 2:6:8 PM"中發生沖突,其中 02:06:08 被視為 AM,但在模式中跟在 PM 之后。

我的解決方案的輸出是這樣的:

2020-12-21T12:12:12
2020-01-12T14:06:08
2020-10-02T10:50:08

它正確地將時間解析為 PM(14 = 02 PM)。

筆記:
不要將此DateTimeFormatter用於輸出LocalDateTime.format(DateTimeFormatter)因為它會返回定義的所有三種格式...
非常丑陋: 10/02/2020 10:50:08 AM10/02/2020 10:50:8 AM10/2/2020 10:50:8 AM

我處理了一個類似的問題,我需要在事先不知道格式的情況下解析一個字符串。 我寫了一篇關於這個想法和實現的文章。 這是文章中的一段話:

所以我想出的解決方案是將一組格式存儲在屬性文件中,當需要解析字符串時,從文件中讀取格式並嘗試使用每種格式依次解析字符串,直到它被解析成功或直到我們用完格式。 此解決方案的優點是,如果您發現未成功解析的有效字符串,您只需將新格式添加到屬性文件中,無需重新編譯和重新部署。 同樣,您可以通過這種方式設置優先級:假設美國日期格式比歐洲日期格式更可取,只需將美國格式放在第一位,然后再放在歐洲格式之后。 同樣在 java 8 中,格式字符串允許使用“[]”表示的可選格式部分。 因此,實際上可以將幾種格式組合成一個帶有可選部分的格式。 例如代替

MM/dd/yyyy
MM-dd-yyyy
MM.dd.yyyy

你可以寫

MM['/']['-']['.']dd['/']['-']['.']yyyy


這是完整文章的鏈接

暫無
暫無

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

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