Java SimpleDataFormat添加一些分钟
我正在尝试从JSONObject解析日期Java SimpleDataFormat添加一些分钟,java,android,parsing,date,simpledateformat,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 发生了什么
"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
发生了什么?这应该是解决方案: SimpleDataFormat不能用微秒,只能用毫秒。正确 乔达时间 作为替代方案,您可以使用第三方开源软件。Joda Time通常用来取代java(和Android)中的java.util.Date和Calendar类 ISO 8601 您拥有的字符串格式松散。将该空格替换为拉丁大写字母T“T”字符,以获得严格的ISO 8601格式 Joda Time的类直接向其构造函数接受ISO 8601字符串。一个问题:与java.util.Date一样,DateTime只跟踪毫秒而不是微秒。但是在Joda Time中,DateTime并没有抛出一个错误,它只是截断(忽略)额外的(超过3)个小数位 示例代码 下面是一些使用JodaTime2.3和Java8的示例代码
String input=“2013-12-11 21:25:04.800842+01”;
字符串字符串=输入。替换(“,“T”);//对于严格的ISO 8601格式,将空格替换为“T”。
DateTime dateTimeUtc=新的日期时间(字符串,DateTimeZone.UTC);
DateTimeZone timeZone=DateTimeZone.forID(“欧洲/巴黎”);
DateTime dateTimeParis=新的日期时间(字符串,时区);
转储到控制台
System.out.println(“dateTimeUtc:+dateTimeUtc”);
System.out.println(“dateTimeParis:+dateTimeParis”);
当运行时
dateTimeUtc:2013-12-11T20:25:04.800Z
巴黎时间:2013-12-11T21:25:04.800+01:00
爪哇8
我尝试使用Java8中新的java.time.*类来解析字符串
ZonedDateTime ZonedDateTime=ZonedDateTime.parse(字符串);
不幸的是,解析器不允许时区偏移为缩短的+01
。我尝试了更长的+01:00
,效果很好。这似乎是Java实现中的一个缺陷,而不是字符串。ISO 8601中允许缩短偏移量。虽然我和RFC3339(接近ISO8601的配置文件)都喜欢使用较长的+01:00
,但ISO标准不允许这样做,java.time.*类也应该这样做。我向Oracle提交了Bug Id:9009717
获取更好的数据
如果可能,建议日期来源使用更严格和通用的ISO 8601格式,包括:
- 用字母“T”代替空格
- 更长的时区偏移量,“+01:00”而不是“+01”