繁体   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