Java 无法将ISO-8601日期字符串解析为日期
我看了一些类似的话题,但对我没有帮助。我有ISO-8601日期类型,例如:Java 无法将ISO-8601日期字符串解析为日期,java,android,date,Java,Android,Date,我看了一些类似的话题,但对我没有帮助。我有ISO-8601日期类型,例如:2014-08-13T19:05:22.168083+00:00。 我尝试对其进行分析,以便: public static Date parseISO8601(final String date) { String fixedDate = date.replaceFirst("(\\d\\d[\\.,]\\d{3})\\d+", "$1"); DateFormat df = new SimpleDateFo
2014-08-13T19:05:22.168083+00:00
。
我尝试对其进行分析,以便:
public static Date parseISO8601(final String date) {
String fixedDate = date.replaceFirst("(\\d\\d[\\.,]\\d{3})\\d+", "$1");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.ENGLISH);
try {
return df.parse(fixedDate);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
但它抛出了一个例外。我不明白为什么?
错误消息:
java.text.ParseException:不可解析日期:“2014-08-13T19:05:22.148+00:00”
时区使用X
而不是Z
,即:
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", ...
试试时区的
X
。你知道它能在Android API 9+上工作吗?它是一个非常古老的类(这就是为什么它有一些怪癖),所以如果它不能在所有Android系统上工作,我会感到惊讶。只是我在Android的“SimpleDateFormat”文档上找不到它。它不能在旧的Android版本上工作。谢谢!我不知道“X”存在。对不起,我在旧设备(API 16)上检查了它,它不工作。旧的Android版本不知道“X”模式。唯一阻止你使用Z
的是时区内的冒号。您可以使用另一个正则表达式删除冒号,即:fixedDateTimezone.replaceAll(“(\\d\\d):(\\d\\d)$”,“$1$2”)
。完成此操作后,Z
也将适用于您。注意正则表达式末尾的美元符号,它确保在几分钟或几秒钟内不会删除冒号,而是在字符串末尾(即时区)。谢谢!我用了子字符串,但我认为你的变体更好。