java中的日期分析异常
我试图验证一个字符串是否在ISO-8601日期内,但它抛出了一个解析异常,不确定哪里出错
try {
String s = "2007-03-01T13:00:00Z";
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
ft.setLenient(false);
System.out.println(ft.format(ft.parse(s)));
} catch (ParseException e) {
System.out.println(e.getMessage());
}
输出为:
Unparseable date: "2007-03-01T10:00:00Z"
# 1 楼答案
您的代码不起作用,因为SDF非常有限,并且在编写时不知道ISO 8601
您可以使用以下代码:
注意时区,这非常重要
# 2 楼答案
如果您使用的是Java 7,请使用以下格式字符串:
"yyyy-MM-dd'T'HH:mm:ssXXX"
注意:} 的API文档
X
是一个新代码(在Java7中添加),与ISO8601时区字符串匹配;请参阅^{# 3 楼答案
我怀疑
Z
被解释为一个时区,因此将匹配-0800
,而不是字面上的Z
,因此您可以通过引用:'Z'
来解决这个问题^{} 应该告诉你问题出在哪里
# 4 楼答案
乔达时间
仅供参考,如果您使用Joda-Time而不是臭名昭著的麻烦java。util。在Date/Calendar类中,您可以简单地将ISO 8601字符串直接传递到DateTime构造函数中,而无需格式化程序。Joda Time使用ISO 8601作为其默认值
验证
要确定输入字符串是否无效,请捕获^{}
爪哇。util。日期
你甚至可以得到一个java。util。如果需要,请注明日期
# 5 楼答案
如果要验证任意字符串,则不能硬编码“Z”时区指示符,因为有效的ISO8601时间戳(如“2007-03-01T13:00:00+01”)的验证将失败
如果您使用的是Java 6或更早版本,SimpleDataFormat将不支持ISO8601时区编码,因此您也不能使用它来验证时间戳。对于Java7或更高版本,您可以使用
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");