【问题标题】:Java parse date from string with GMT stringJava从带有GMT字符串的字符串中解析日期
【发布时间】:2020-07-02 06:41:08
【问题描述】:

我有以下日期字符串Tue Feb 04 2020 16:11:25 GMT+0200 (IST),我正在尝试使用以下代码将其转换为日期时间:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM d yyyy HH:mm:ss O (zzz)", Locale.ENGLISH);
LocalDate dateTime = LocalDate.parse("Tue Feb 04 2020 16:11:25 GMT+0200 (IST)", formatter);

我得到了以下异常:

2020 年 2 月 4 日星期二 16:11:25 GMT+0200 (IST) 无法在索引 28 处解析

我查看了以下 SO 问题 Java string to date conversion,我明白了

O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;

那么为什么我得到了异常?

【问题讨论】:

  • 当类型为LocalDate,即仅日期时,为什么要调用变量dateTime? --- 为什么你将一个带有日期、时间和区域偏移的字符串解析为LocalDate,而不是OffsetDateTime

标签: java java-time


【解决方案1】:

以下模式有效。

"E MMM d u H:m:s 'GMT'Z (z)"

您可以将Z 替换为xX 以获得相同的结果。

如果你愿意,你可以拼出来,但这不是必须的。

"EEE MMM dd uuuu HH:mm:ss 'GMT'ZZZ (zzz)"

您应该将该输入解析为OffsetDateTime,因为输入字符串包括日期、时间、偏移量。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM d u H:m:s 'GMT'Z (z)", Locale.ENGLISH);
OffsetDateTime dateTime = OffsetDateTime.parse("Tue Feb 04 2020 16:11:25 GMT+0200 (IST)", formatter);
System.out.println(dateTime);

输出

2020-02-04T16:11:25+02:00

【讨论】:

    【解决方案2】:

    其中一个原因是您试图将日期时间String(日期、时间、区域和偏移量)解析为仅存储年、月和日的对象 (LocalDate),仅此而已。

    使用合适的类,比如ZonedDateTime 并稍微调整解析模式:

    • 您不能使用本地化偏移量O,因为在DateTimeFormatter 中,它不支持String 具有的格式,即GMT+0200,并且格式化程序仅支持GMT+8; GMT+08:00; UTC-08:00;(注意冒号)。使用转义的GMT 加上常规偏移符号x 的组合
    • 你有一个d,但表示天数总是有两位数,所以你需要使用dd
    • 您必须转义包含区域缩写的括号,我认为单个 z 足以用于此类缩写

    考虑到所有这些方面,您可以将String 解析如下:

    public static void main(String[] args) {
        String parsePattern = "EEE MMM dd yyyy HH:mm:ss 'GMT'x '('z')'";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(parsePattern,
                                                                    Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse("Tue Feb 04 2020 16:11:25 GMT+0200 (IST)", formatter);
        System.out.println(zdt);
    }
    

    然后输出(使用ZonedDateTime 的默认格式化程序)

    2020-02-04T16:11:25+02:00[Asia/Jerusalem]
    

    【讨论】:

      【解决方案3】:

      这里的问题是 GMT+0200 如果你使用:GMT+02 它可以工作。 但是正如 cmets 中已经提到的,在 LocalDate 类型的东西上使用名为 dateTime 的变量有点令人困惑。 所以你的结果只会是日期2020-02-04,因为LocalDate只能保存这种数据。

      【讨论】:

        【解决方案4】:

        2 件事 - ZonedDateTime & 缺少 ':' 为 0

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd yyyy HH:mm:ss O (zzz)");
        ZonedDateTime dateTime = ZonedDateTime.parse("Tue Feb 04 2020 16:11:25 GMT+02:00 (IST)", formatter);
        

        【讨论】:

          【解决方案5】:

          这应该可以工作

          DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM d yyyy HH:mm:ss 'GMT'Z (z)", Locale.ENGLISH);
                  LocalDate dateTime = LocalDate.parse("Tue Feb 04 2020 16:11:25 GMT+0200 (IST)", formatter);
          

          【讨论】:

            【解决方案6】:

            时区不要使用固定文本:

            不要对现有答案中提到的时区使用固定文本(例如'GMT'),因为这种方法可能会在其他语言环境中失败。

            推荐的解决方案:

            import java.time.ZonedDateTime;
            import java.time.format.DateTimeFormatter;
            import java.util.Locale;
            
            public class Main {
                public static void main(String[] args) {
                    String strDateTime = "Tue Feb 04 2020 16:11:25 GMT+0200 (IST)";
                    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E MMM d u H:m:s VVZ (z)", Locale.ENGLISH);
                    ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
                    System.out.println(zdt);
                }
            }
            

            输出:

            2020-02-04T14:11:25Z[Atlantic/Reykjavik]
            

            ONLINE DEMO

            Trail: Date Time 了解有关现代日期时间 API 的更多信息。

            【讨论】:

              【解决方案7】:

              你写了一个 d 并且你通过了 04 你应该写 dd 而不是 d 如下所示

              DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd yyyy HH:mm:ss O (zzz)", Locale.ENGLISH);
              

              LocalDate dateTime = LocalDate.parse("Tue Feb 04 2020 16:11:25 GMT+0200 (IST)", formatter);

              【讨论】:

              • 解析时没有区别。
              • 我认为你不会乐于尝试将一些带有偏移量和区域信息的String 解析为LocalDateTime...
              猜你喜欢
              • 2012-10-21
              • 1970-01-01
              • 1970-01-01
              • 2013-11-21
              • 1970-01-01
              • 1970-01-01
              • 2012-10-06
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多