我正在尝试从JSONObject解析日期
"timcre_not":"2013-12-11 21:25:04.800842+01"
我用
解析mDate = new SimpleDateFormat("y-M-d h:m:s.SSSSSSZZ",
Locale.ENGLISH).parse(json.getString("timcre_not"));
但mDate值为:
Wed Dec 11 21:38:24 CET 2013
发生了什么事?
答案 0 :(得分:2)
这应该是解决方案:Date object SimpleDateFormat not parsing timestamp string correctly in Java (Android) environment
SimpleDateFormat不能采用微秒,只能是毫秒。
答案 1 :(得分:1)
answer by treeno是正确的。
作为替代方案,您可以使用第三方开源Joda-Time。 Joda-Time经常被用来取代java.util.Date&在Java(和Android)中找到的日历类。
您拥有的字符串格式为ISO 8601格式。将该SPACE替换为LATIN CAPITAL LETTER T“T”字符,以获得严格的ISO 8601格式。
Joda-Time的DateTime
类直接接受ISO 8601字符串到其构造函数。一个问题:与java.util.Date一样,DateTime仅跟踪毫秒而非微秒。但是在Joda-Time中,DateTime只是截断(忽略)额外的(超过3个)小数位而不是抛出错误。
以下是一些使用Joda-Time 2.3和Java 8的示例代码。
String input = "2013-12-11 21:25:04.800842+01";
String string = input.replace( " ", "T" ); // Replace SPACE with "T" for strict ISO 8601 format.
DateTime dateTimeUtc = new DateTime( string, DateTimeZone.UTC );
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTimeParis = new DateTime( string, timeZone );
转储到控制台...
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "dateTimeParis: " + dateTimeParis );
跑步时......
dateTimeUtc: 2013-12-11T20:25:04.800Z
dateTimeParis: 2013-12-11T21:25:04.800+01:00
我尝试在Java 8中使用新的java.time。*类来解析你的字符串。
ZonedDateTime zonedDateTime = ZonedDateTime.parse( string );
不幸的是,解析器不能容忍时区偏移是缩短的+01
。我尝试了更长的+01:00
并且它有效。这似乎是Java实现中的缺陷,而不是您的字符串。 ISO 8601中允许缩短的偏移量。虽然I和RFC 3339(ISO 8601的近似轮廓)更喜欢使用更长的+01:00
,但ISO标准允许使用它,因此java.time。*类也应该这样做。我向Oracle提交了错误ID:9009717。
如果可能,请向您的日期来源建议他们使用更严格和通用的ISO 8601格式,包括: