SimpleDateFormat添加几分钟

时间:2014-01-16 12:41:27

标签: java android parsing date simpledateformat

我正在尝试从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

发生了什么事?

2 个答案:

答案 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

您拥有的字符串格式为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”