Java:将多个字符串日期时间格式解析为 LocalDateTime/Date/Calender

Thi*_*raj 1 java datetime datetime-format java-8

我正在尝试将字符串日期时间解析为JavaLocalDateTime或Date在 Java 中。我可能得到的输入,比如12/21/2020 12:12:12 PM,1/12/2020 2:6:8 PM,10/2/2020 10:50:8 AM

我尝试在DateTimeFormatter或下DateTimeFormatBuilder可以使用不同类型的模式。蛮力方法我在哪里 硬编码不同的模式组合。这是从链接复制的代码:

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有其他解决方案,因为我无法控制输入?我可以使用哪个单一模式而Formatter不是多个组合?或者在解析之前接收后修改输入更好吗?

deH*_*aar 5

tl;博士

LocalDateTime.parse(dateTimeString, DateTimeFormatter.ofPattern("M/d/yyyy h:m:s a");
足以满足您所有的日期时间示例。


以下示例能够String通过使用LocalDateTime.parse代替来解析所有示例 datetime DateTimeFormatter.parse,它们是不同的:

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));
}
Run Code Online (Sandbox Code Playgroud)

看一下使用的第二个 / 中间模式,它使用h(小写)表示小时而不是H(大写),因为一天的 AM/PM 也将从大写派生H,这会导致冲突第二个日期时间样本"1/12/2020 2:6:8 PM",其中 02:06:08 被认为是 AM,但在模式中跟随着 PM。

我的解决方案的输出是这样的:

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));
}
Run Code Online (Sandbox Code Playgroud)

它正确地将时间解析为 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