gpt4 book ai didi

java - 用于解析 Java 中任何日期格式的单个类

转载 作者:行者123 更新时间:2023-12-04 15:50:25 24 4
gpt4 key购买 nike

我一直在解析以下格式的日期。我维护这些格式的数组并解析所有这些格式的每个日期字符串。

我使用的代码是-

SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
simpleDateFormat.setTimeZone(timeZone); //timeZone is a java.util.TimeZone object
Date date = simpleDateFormat.parse(dateString);

现在我也想解析 yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX 格式,但是使用 SimpleDateFormat 不考虑 6 位微秒。所以我查看了 java.time 包。

要解析 yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX 格式,我需要 OffsetDateTime 类,对于其他格式,我需要 ZonedDateTime 类。格式将在 DateTimeFormatter 类中设置。

有没有办法使用像 SimpleDateFormat 这样的单个类来传递所有格式?

最佳答案

由于您的 Java 8 未按合理预期运行,我建议解决方法是首先尝试在没有区域的情况下进行解析。如果从字符串中解析出区域或偏移量,则将使用它。如果没有区域的解析失败,请尝试使用区域。以下方法可以做到这一点:

private static void parseAndPrint(String formatPattern, String dateTimeString) {
// Try parsing without zone first
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatPattern);
Instant parsedInstant;
try {
parsedInstant = formatter.parse(dateTimeString, Instant::from);
} catch (DateTimeParseException dtpe) {
// Try parsing with zone
ZoneId defaultZone = ZoneId.of("Asia/Calcutta");
formatter = formatter.withZone(defaultZone);
parsedInstant = formatter.parse(dateTimeString, Instant::from);
}
System.out.println("Parsed instant: " + parsedInstant);
}

让我们试试看:

    parseAndPrint("yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX", "2018-10-22T02:17:58.717853Z");
parseAndPrint("yyyy-MM-dd'T'HH:mm:ss.SSSSSS", "2018-10-22T02:17:58.717853");
parseAndPrint("EEE MMM d HH:mm:ss zzz yyyy", "Mon Oct 22 02:17:58 CEST 2018");

Java 8 的输出是:

Parsed instant: 2018-10-22T02:17:58.717853Z
Parsed instant: 2018-10-21T20:47:58.717853Z
Parsed instant: 2018-10-22T00:17:58Z

第一个例子在字符串中有一个偏移量,最后一个例子在字符串中有一个时区缩写,在这两种情况下都是这样:即时打印已将时间调整为 UTC(因为 Instant 总是以 UTC 打印,它的 toString 方法确保)。中间的例子在字符串中既没有偏移量也没有时区,所以使用方法中指定的默认时区 Asia/Calcutta。

也就是说,解析像 CEST 这样的三个或四个字母的时区缩写是一种危险且不鼓励的做法,因为缩写通常是模棱两可的。我包含示例只是为了演示。

Is there a way to use a single class…?

我在所有情况下都使用了 Instant,所以是的,有一种方法可以只使用一个类。限制是您之后不知道字符串中是否有任何时区或偏移量,也不知道它是什么。您不知道什么时候使用 SimpleDateFormatDate,所以我认为它没问题?

Java 8 中的错误?

结果来自 your demonstration on REX tester令人失望和错误,不同意我在 Java 11 上得到的结果。在我看来,您遇到了 Java 8 中的错误,可能是 this one: Parsing with DateTimeFormatter.withZone does not behave as described in javadocs .

关于java - 用于解析 Java 中任何日期格式的单个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54073351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com