我正在尝试解析日期时间字符串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的解决方案?
答案 0 :(得分:1)
我会给你很好的解决方案和黑客。
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上执行此操作。
SimpleDateFormat
课程不仅已经过时了,而且也是出了名的麻烦,所以我建议你不要使用它,现代的API可以更好地使用+01
的时区偏移量是ISO 8601偏移量。虽然只有SimpleDateFormat
的后期版本可以解析这一点,java.time
在出现时已经达到了ISO 8601标准,所以这是一个安全的选择。我应该说你有一个很好的机会去面向未来。
您00:00:00
的时间似乎表明您只对约会感兴趣?如果是这样,java.time
还有一个优惠,LocalDate
类代表没有时间的日期:
LocalDate date = dateTime.toLocalDate();
这给出了2017-12-01的LocalDate
。
您可以将00
的偏移量附加到字符串中,并且问题中的格式化程序会解析它:
dateTimeString += "00";
java.time
?如果您的Android设备未内置java.time
,则会获得ThreeTenABP并将其添加到您的项目中,然后导入org.threeten.bp.OffsetDateTime
,org.threeten.bp.LocalDate
和org.threeten.bp.format.DateTimeFormatter
。请参阅以下链接。代码从上面保持不变。
java.time
。java.time
向Java 6和7 答案 1 :(得分:0)
问题在于"+01"
时区后缀。这不是" General time zone"下的时区的有效表示。规则或" RFC 822 time zone"规则。
您可以将SimpleDateFormat
更改为"yyyy-MM-dd HH:mm:ss"
,这将允许解析日期,但会忽略时区后缀。然后,您可以手动解析时区后缀并相应地修改Date
。
或者,如果您可以以某种方式更改输入以包括偏移分钟以及小时(即将时区后缀更改为"+0100"
),那么您现有的日期格式将起作用精细。除了小时之外还包括分钟,根据RFC 822,时区后缀可以解析。