Android Unparseable日期:" 2017-12-01 00:00:00 + 01"

时间:2018-01-16 19:43:27

标签: java android datetime simpledateformat timezone-offset

我正在尝试解析日期时间字符串2017-12-01 00:00:00+01。 我的模式如下:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");

Android 7及更高版本会引发例外情况“Unparseable date:" 2017-12-01 00:00:00 + 01"”。

我找到了另一种模式:" yyyy-MM-dd HH:mm:ssX"但它仅适用于Android 7及更高版本。

我试过这个解决方法" yyyy-MM-dd HH:mm:ssZZZZZ"我在这里找到了,但它没有用。

是否有适用于Android 7以下的Android的解决方案?

2 个答案:

答案 0 :(得分:1)

我会给你很好的解决方案和黑客。

java.time

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ssX");
    OffsetDateTime dateTime = OffsetDateTime.parse(dateTimeString, formatter);
    System.out.println(dateTime);

打印

2017-12-01T00:00+01:00

这是一个很好的解决方案:java.time,现代Java日期和时间API。至少有两个原因可以让您在Android上执行此操作。

  1. 你一直使用的SimpleDateFormat课程不仅已经过时了,而且也是出了名的麻烦,所以我建议你不要使用它,现代的API可以更好地使用
  2. +01的时区偏移量是ISO 8601偏移量。虽然只有SimpleDateFormat的后期版本可以解析这一点,java.time在出现时已经达到了ISO 8601标准,所以这是一个安全的选择。
  3. 我应该说你有一个很好的机会去面向未来。

    00:00:00的时间似乎表明您只对约会感兴趣?如果是这样,java.time还有一个优惠,LocalDate类代表没有时间的日期:

        LocalDate date = dateTime.toLocalDate();
    

    这给出了2017-12-01的LocalDate

    黑客

    您可以将00的偏移量附加到字符串中,并且问题中的格式化程序会解析它:

        dateTimeString += "00";
    

    问题:如何在较旧的Android上使用java.time

    如果您的Android设备未内置java.time,则会获得ThreeTenABP并将其添加到您的项目中,然后导入org.threeten.bp.OffsetDateTimeorg.threeten.bp.LocalDateorg.threeten.bp.format.DateTimeFormatter。请参阅以下链接。代码从上面保持不变。

    链接

答案 1 :(得分:0)

问题在于"+01"时区后缀。这不是" General time zone"下的时区的有效表示。规则或" RFC 822 time zone"规则。

您可以将SimpleDateFormat更改为"yyyy-MM-dd HH:mm:ss",这将允许解析日期,但会忽略时区后缀。然后,您可以手动解析时区后缀并相应地修改Date

或者,如果您可以以某种方式更改输入以包括偏移分钟以及小时(即将时区后缀更改为"+0100"),那么您现有的日期格式将起作用精细。除了小时之外还包括分钟,根据RFC 822,时区后缀可以解析。