本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
Debug 笔记 <这个日期格式是什么?2011-08-12T20:17:46.384Z>
提问
我有以下日期: 2011-08-12T20:17:46.384Z。
这是什么格式?
我正在尝试通过Java 1.4解析它,
DateFormat.getDateInstance().parse(dateStr)并且得到了
java.text.ParseException:无法解析的日期:“ 2011-08-12T20:17:46.384Z”
我认为我应该使用SimpleDateFormat
进行解析,但是我必须首先知道格式字符串。到目前为止yyyy-MM-dd,我所拥有的只是,因为我不知道T该字符串的含义是什么-与时区有关?此日期字符串来自文件CMIS下载历史记录媒体类型的lcmis:downloadedOn上显示的标签。
回答一:
T只是将日期和时间分开的文字,Z表示“零时偏移”,也称为“祖鲁时间”(UTC)。如果您的字符串始终带有“ 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()。
回答二:
tl; dr
输入字符串使用标准ISO 8601格式。
Instant.parse ( "2011-08-12T20:17:46.384Z" )
ISO 8601
此格式由实用标准ISO 8601定义。
将T日期部分与时间部分分开。该Z对端装置UTC(即,偏移从-UTC零小时-分钟-秒)。
java.time
事实证明,与最早的Java版本捆绑在一起的旧的日期时间类设计不佳,令人困惑且麻烦。避免他们。
相反,请使用Java 8及更高版本中内置的java.time框架。java.time类取代了旧的日期时间类和非常成功的Joda-Time库。
解析/生成日期时间值的文本表示时,java.time类默认使用ISO 8601。
该Instant级表示时间轴上的时刻UTC,分辨率为纳秒。该类可以直接解析您的输入字符串,而无需费心定义格式设置模式。
回答三:
还有其他解析方法,而不是第一个答案。要对其进行解析,请执行以下操作:
1.如果要获取有关日期和时间的信息,可以将其解析为ZonedDatetime(自Java 8以来)或Date(旧)对象:
// ZonedDateTime's default format requires a zone ID(like [Australia/Sydney]) in the end.
// Here, we provide a format which can parse the string correctly.
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf);
或者
// 'T' is a literal.
// 'X' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as 'Z'(Zero) literal.
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX";
// since no built-in format, we provides pattern directly.
DateFormat df = new SimpleDateFormat(pattern);
Date myDate = df.parse("2011-08-12T20:17:46.384Z");
2.如果您不在乎日期和时间,而只想将信息视为以纳秒为单位的时刻,则可以使用Instant:
// The ISO format without zone ID is Instant's default.
// There is no need to pass any format.
Instant ins = Instant.parse("2011-08-12T20:17:46.384Z");
文章翻译自Stack Overflow :stackoverflow.com/questions/8…