我正在尝试做一个时间戳验证使用乔达时间-1.6.2。请指出我的错误并帮助我。Code
String timestamp = "2014-09-23T23:03:11Z";
String datePattern = "yyyy-MM-dd'T'HH:mm:ssZ";
try {
DateTimeFormatter dateFormatter = DateTimeFormat.forPattern(datePattern);
dateFormatter.parseDateTime(timestamp);
} catch (Exception e) {
LOG.info("Timestamp is invalid format" + e);
}
例外
INFO: Timestamp is invalid formatjava.lang.IllegalArgumentException: Invalid format: "2014-09-23T23:03:11Z" is malformed at "Z"
我对将 Z 视为字面意思非常怀疑。字符Z有一个含义,即零偏移量。的文档乔达时间版本 1.6 http://joda-time.sourceforge.net/api-1.6/org/joda/time/format/ISODateTimeFormat.html#dateTimeNoMillis()关于这段代码说:
String timestamp = "2014-09-23T23:03:11Z";
DateTime dt =
ISODateTimeFormat.dateTimeNoMillis().parseDateTime(timestamp).withZone(DateTimeZone.UTC);
System.out.println(dt); // 2014-09-23T23:03:11.000Z
返回一个格式化程序,它组合了完整的日期和时间,没有毫秒,
用“T”分隔(yyyy-MM-dd'T'HH:mm:ssZZ)。时区偏移量为
“Z”代表零,“±HH:mm”形式代表非零。
现在让我们详细查看以下四种替代方案(使用版本 1.6.2 进行显式测试):
String timestamp = "2014-09-23T23:03:11Z";
DateTimeZone utc = DateTimeZone.UTC;
DateTime dt1 = ISODateTimeFormat.dateTimeNoMillis().parseDateTime(timestamp).withZone(utc);
System.out.println(dt1); // 2014-09-23T23:03:11.000Z (OK)
DateTime dt2 = new DateTime(timestamp, utc);
System.out.println(dt2); // 2014-09-23T23:03:11.000Z (OK)
DateTime dt3 =
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").parseDateTime(timestamp).withZone(utc);
System.out.println(dt3); //2014-09-23T21:03:11.000Z (WRONG!!!)
DateTime dt4 =
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ").parseDateTime(timestamp).withZone(utc);
// exception: Invalid format: "2014-09-23T23:03:11Z" is malformed at "Z"
结论:到目前为止,将 Z 视为文字的其他答案是错误的,因为输入是在本地时区中处理的,而不是使用偏移量 UTC+00:00。使用构造函数或特定类IsoDateTimeFormat
(为了清楚起见,我更喜欢后一种)。
关于异常:这是2.0版本解决的一个bug,参见发行说明 http://joda-time.sourceforge.net/upgradeto200.html。您最好更新您的库版本。
允许格式模式中的“Z”和“ZZ”将“Z”解析为“+00:00”
[2827359]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)