将时区字符串日期解析为Java的即时数据

Nik*_*las 3 java java-time

我正在阅读一些发送典型内容的 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 + OffsetDateTimeparse()方法。尽管我还没有找到一种方法来获取可以转换为Instant. 我既不能控制源,也不能修复输出格式。

我怎样才能更宽容地解析这些日期时间?

Mat*_*att 5

您可以DateTimeFormatter使用自定义模式创建一个开头有可选星期几的模式。然后,使用parse格式化程序的方法,您可以直接指定解析的日期时间的所需类型(根据Ole VV的注释)。另一种方法是首先解析为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);
Run Code Online (Sandbox Code Playgroud)

输出:

2021-05-25T04:00:00Z
2021-06-03T10:35:00Z
Run Code Online (Sandbox Code Playgroud)

  • [切勿在没有区域设置的情况下使用 SimpleDateFormat 或 DateTimeFormatter](/sf/answers/4588083951/) (2认同)
  • 好答案。可能的替代方案:“Instant instant1 = formatter.parse(input1, Instant::from);”(与“input2”相同)。对我来说感觉有点简单,但这是一个品味问题。巧妙而巧妙地使用了星期几的可选部分(方括号)! (2认同)
  • @OleV.V。感谢您分享您的替代方案,我个人认为它更好,因为不需要从“ZonedDateTime”到“Instant”进行额外的转换。我相应地更新了我的答案。 (2认同)