将时区字符串日期解析为 Java 的即时
Parsing Timezone String Date into Java's Instant
我正在从一些 不 发送典型的 RSS 站点阅读:
- iso 表示法
2019-06-12T07:17:47Z
- Instant.parse()
可以用
- RFC1123
Wed, 12 Jun 2019 03:17:47 -0400
-DateTimeFormatter.RFC_1123_DATE_TIME.parse()
可以用
相反,我得到了这些字符串:
Tue, 25 May 2021 00:00:00 EDT
03 Jun 2021 18:35:00 HKT
我已经尝试过一些自定义模式和 ZonedDateTime + OffsetDateTime parse()
方法。虽然我还没有找到一种方法来获取可以转换为 Instant
的日期时间表示形式。我也无法控制来源,无法固定输出格式。
如何更宽容地解析这些日期时间?
您可以使用自定义模式创建一个 DateTimeFormatter
,该模式的开头有一个可选的 星期几。然后,使用格式化程序的 parse
方法,您可以直接指定所需的解析日期时间类型(根据 Ole V.V. 的注释) .另一种方法是首先解析为 ZonedDateTime
然后转换为 Instant
.
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("[EEE, ]dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH);
String input1 = "Tue, 25 May 2021 00:00:00 EDT";
Instant instant1 = formatter.parse(input1, Instant::from);
// Instant instant1 = ZonedDateTime.parse(input1, formatter).toInstant();
System.out.println(instant1);
String input2 = "03 Jun 2021 18:35:00 HKT";
Instant instant2 = formatter.parse(input2, Instant::from);
// Instant instant2 = ZonedDateTime.parse(input2, formatter).toInstant();
System.out.println(instant2);
输出:
2021-05-25T04:00:00Z
2021-06-03T10:35:00Z
我正在从一些 不 发送典型的 RSS 站点阅读:
- iso 表示法
2019-06-12T07:17:47Z
-Instant.parse()
可以用
- RFC1123
Wed, 12 Jun 2019 03:17:47 -0400
-DateTimeFormatter.RFC_1123_DATE_TIME.parse()
可以用
相反,我得到了这些字符串:
Tue, 25 May 2021 00:00:00 EDT
03 Jun 2021 18:35:00 HKT
我已经尝试过一些自定义模式和 ZonedDateTime + OffsetDateTime parse()
方法。虽然我还没有找到一种方法来获取可以转换为 Instant
的日期时间表示形式。我也无法控制来源,无法固定输出格式。
如何更宽容地解析这些日期时间?
您可以使用自定义模式创建一个 DateTimeFormatter
,该模式的开头有一个可选的 星期几。然后,使用格式化程序的 parse
方法,您可以直接指定所需的解析日期时间类型(根据 Ole V.V. 的注释) .另一种方法是首先解析为 ZonedDateTime
然后转换为 Instant
.
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("[EEE, ]dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH);
String input1 = "Tue, 25 May 2021 00:00:00 EDT";
Instant instant1 = formatter.parse(input1, Instant::from);
// Instant instant1 = ZonedDateTime.parse(input1, formatter).toInstant();
System.out.println(instant1);
String input2 = "03 Jun 2021 18:35:00 HKT";
Instant instant2 = formatter.parse(input2, Instant::from);
// Instant instant2 = ZonedDateTime.parse(input2, formatter).toInstant();
System.out.println(instant2);
输出:
2021-05-25T04:00:00Z
2021-06-03T10:35:00Z