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不能采用微秒,只能是毫秒。