我正在尝试使用joda time-1.6.2进行时间戳验证。请指出我的错误并帮助我解决问题。码
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"发布于 2014-09-24 06:29:05
为了不仅得到一个vaild时间戳格式,而且还有零偏移从UTC使用。
String timestamp = "2014-09-23T23:03:11Z";
DateTime dt = new DateTime(timestamp, DateTimeZone.UTC);否则/陷阱
如果不显式地将时间戳指定为UTC,则可能假定本地时间的偏移量为零。此外,虽然以下可能是一种有效的模式,但也有些误导。
String timestamp = "2014-09-23T23:03:11Z";
String datePattern = "yyyy-MM-dd'T'HH:mm:ss'Z'";正如Meno所描述的,这将零时区偏移量视为文字(因此忽略它)。
同时考虑一下对更详细地解释这个问题的答案,因为我现在不允许删除我的(已接受的答案)。
发布于 2014-09-24 10:06:22
我非常怀疑把Z当作字面上的东西。 char Z有一个意思,即零偏移量。-- Joda-Time版本1.6的文档说明了这段代码:
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返回一个没有millis的完整日期和时间组合的格式化程序,以'T‘分隔(yyyy’T‘mm: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"结论:到目前为止给出的其他答案都是错误的,因为输入是在局部时区处理的,而不是用偏移量UTC+00:00处理的。使用构造函数或特定的类IsoDateTimeFormat (为了清楚起见,我更喜欢后者)。
关于异常:--这是一个用2.0版本解决的bug,请参阅释放-备注。你最好更新你的库版本。
允许格式模式中的“Z”和“ZZ”解析“Z”为'+00:00‘2827359
发布于 2014-09-24 06:23:13
来自v1.6 API文档
'Z‘输出没有冒号的偏移量,'ZZ’用冒号输出偏移量,'ZZZ‘或更多输出区域id。
当您在模式中指定Z (没有单引号)时,时间戳中的值必须以+HHMM或-HHMM格式作为与UTC的数字偏移。文字字符Z是指定格式的无效输入。
示例:
正如莱维特在另一个答案中提到的那样,如果目标是接受输入时间戳中的文字“Z”,而不将其视为时区(糟糕的想法),则可以使用模式中的单引号(...'Z')引用Z字符。这类似于对分隔日期组件和时间组件的文字'T‘所做的操作。不建议将输入中的Z视为文字,因为它有意义,如果提供,则时区是时间戳的一个重要组成部分。
https://stackoverflow.com/questions/26009841
复制相似问题