【问题标题】:How can I correctly parse this specific Date? [duplicate]如何正确解析此特定日期? [复制]
【发布时间】:2015-04-06 10:57:09
【问题描述】:

我无法为我的日期找到正确且干净的工作解决方案,其格式如下:

2014-06-09T00:01+0200

(这里是 6 月 9 日)

我最后一次尝试是这样的:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmXXX", Locale.ENGLISH);

这只是给了我一个无法解析的日期异常。你觉得我应该改变什么?

【问题讨论】:

    标签: java date date-format simpledateformat


    【解决方案1】:

    使用Z 代替XXX 或一个X

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ", Locale.ENGLISH);
    

    来自documentation

    Z 时区 RFC 822 时区 -0800

    X 时区 ISO 8601 时区 -08; -0800; -08:00

    【讨论】:

      【解决方案2】:

      XXX替换为Z

      String dateTimestr = "2014-06-09T00:01+0200";
      SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
      s.parse(dateTimestr);
      

      打印,

      System.out.println(s.format(s.parse(dateTimestr)));
      

      使用 Java 8,

      OffsetDateTime dateTime = OffsetDateTime.parse("2014-06-09T00:01+02:00");
      System.out.println(dateTime.toString());
      

      请注意,OffsetDateTime.parse 仅在您的字符串是正确的 ISO8601 日期格式时才有效。如果您的日期格式不同,那么您必须使用DateTimeFormatter 为您的OffsetDateTime.parse() 提供适当的格式化程序。即

      OffsetDateTime.parse(yourStringDate, DateTimeFormatter formatter)
      

      【讨论】:

        【解决方案3】:

        问题是 XXX 要求时区格式带有冒号,即 2014-06-09T00:01+02:00

        使用 Z 代替 XXX 或使用 XX(2 个 X)应该接受不带冒号的格式

        小心使用某些人发布的 X,因为这会忽略时区的最后两位数字(例如,2014-06-09T00:01+02)。如果在时区偏移为 +05:30 的某些国家/地区(例如印度)使用时区,这可能会出现问题。请注意以下代码..

        System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mmXXX").format(new SimpleDateFormat("yyyy-MM-dd'T'HH:mmX").parse("2014-06-09T00:01+05:30")));
        

        将打印 2014-06-08T14:01-05:00。使用一个 X 时,时区中的 :30 丢失了。Documentation

        【讨论】:

          猜你喜欢
          • 2021-09-13
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-03
          • 2018-10-09
          • 1970-01-01
          • 2015-08-07
          相关资源
          最近更新 更多