SimpleDateFormat添加几分钟
我尝试从JSONObject解析日期
"timcre_not":"2013-12-11 21:25:04.800842+01"
我解析
mDate = new SimpleDateFormat("yMd h:m:s.SSSSSSZZ", Locale.ENGLISH).parse(json.getString("timcre_not"));
但是mDate值是:
Wed Dec 11 21:38:24 CET 2013
发生什么事?
treeno的答案是正确的。
乔达时间
作为替代方案,您可以使用第三方开源Joda-Time 。 Joda-Time通常用于取代Java(和Android)中的java.util.Date和Calendar类。
ISO 8601
您拥有的字符串是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 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格式,包括:
- 使用字母“T”代替SPACE
- 更长的时区偏移,“+01:00”而不是“+01”
这应该是解决方案: Date对象SimpleDateFormat在Java(Android)环境中无法正确解析时间戳字符串
SimpleDateFormat不能采用微秒,只能是毫秒。