这是什么date格式? 2011-08-12T20:17:46.384Z

我有以下date: 2011-08-12T20:17:46.384Z 。 这是什么格式? 我试图parsing它与Java 1.4通过DateFormat.getDateInstance().parse(dateStr) ,我得到

java.text.ParseException:无法parsing的date:“2011-08-12T20:17:46.384Z”

我想我应该使用SimpleDateFormatparsing,但我必须先知道格式string。 我到目前为止所有的东西都是yyyy-MM-dd ,因为我不知道Tstring在这个string中意味着什么 – 与时区有关? 此datestring来自Files CMIS下载历史logging介质types上显示的lcmis:downloadedOn标记。

T只是一个字面意思,用来区分date和时间,Z表示“零时差”,也就是所谓的“祖鲁时间”(UTC)。 如果你的string总是有一个“Z”,你可以使用:

 SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); format.setTimeZone(TimeZone.getTimeZone("UTC")); 

或者使用Joda Time ,您可以使用ISODateTimeFormat.dateTime()

不知道Javaparsing,但这是ISO8601: http : //en.wikipedia.org/wiki/ISO_8601

TL;博士

 Instant.parse ( "2011-08-12T20:17:46.384Z" ) 

ISO 8601

这种格式由合理的实际标准ISO 8601定义 。

T将date部分与时间部分分开。 Z最后是Zulu缩写,意思是UTC 。

java.time

与最早版本的Java捆绑在一起的旧date时间类已被certificate是devise不佳,混乱和麻烦的。 避免他们。

相反,使用Java 8及更高版本中内置的java.time框架。 java.time类取代了旧的date时间类和高度成功的Joda-Time库。

在parsing/生成date时间值的文本表示时,java.time类默认使用ISO 8601 。

Instant类表示UTC时间轴上的时间,分辨率为纳秒 。 这个类可以直接parsing你的inputstring,而不用麻烦定义一个格式化模式。

 Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ; 

解决这个问题的简单方法是用" "replace"T" " "并删除.384Z

下面是如何实现这一目的的说明:

 public static String getTime(String time) { if (time != null) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (time.toUpperCase().contains("T") && time.toUpperCase().contains("Z")) { time = time.toUpperCase().replace("T", " "); String[] str = time.split("\\."); if (str.length != 0) { return str[0]; } } try { Date date = new Date(time); time = simpleDateFormat.format(date); } catch (Exception e) { // } } return time; }