Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleDataFormat添加一些分钟_Java_Android_Parsing_Date_Simpledateformat - Fatal编程技术网

Java SimpleDataFormat添加一些分钟

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 发生了什么

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

发生了什么?

这应该是解决方案:

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”

时区是什么?如本例所示,每个SimpleDataFormat实例都有一个时区。这是因为调用它来格式化Date实例,它表示UTC的绝对时间。也就是说,Date不包含时区信息。默认情况下,SimpleDataFormat将使用系统的默认时区读者注意……请注意关于示例字符串的三个有趣的事情:(1)中间的空格而不是“T”;(2)小数点后的六位小数;(3)较短的时区偏移量为“+01”,而不是更常见的“+01:00”。