[英]Java: Parse multiple String Date Time format into LocalDateTime/Date/Calender
我正在尝试将字符串日期时间解析为 Java 中的LocalDateTime
或Date
。 我可能会得到输入 像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"));
}
}
有没有其他解决方案,因为我无法控制输入? 我可以在Formatter
使用哪个模式而不是多个组合? 或者在解析之前接收后修改输入更好吗?
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.