我有以下日期: 2011-08-12T20:17:46.384Z
. 这是什么格式的?我试图通过 DateFormat.getDateInstance().parse(dateStr)
用Java 1.4解析它,我得到了
java.text.ParseException:Unparseable date:“2011-08-12T20:17:46.384Z”
我想我应该使用SimpleDateFormat进行解析,但我必须首先知道格式字符串 . 到目前为止,我所拥有的只是 yyyy-MM-dd
,因为我不知道 T
在这个字符串中的含义 - 与时区有关吗?此日期字符串来自Files CMIS download history media type上显示的 lcmis:downloadedOn
标记 .
5 回答
T只是将日期与时间分开的文字,Z表示"zero hour offset"也称为"Zulu time"(UTC) . 如果您的字符串总是有"Z",您可以使用:
或者使用Joda Time,您可以使用ISODateTimeFormat.dateTime() .
tl;博士
输入字符串使用标准ISO 8601格式 .
ISO 8601
这种格式由合理的实用标准ISO 8601定义 .
T
将日期部分与时间部分分开 . 最后的Z
是Zulu
的缩写,意思是UTC .java.time
与最早版本的Java捆绑在一起的旧日期时间类已被证明设计糟糕,令人困惑且麻烦 . 避免他们 .
相反,使用Java 8及更高版本中内置的java.time框架 . java.time类取代了旧的日期时间类和非常成功的Joda-Time库 .
在解析/生成日期时间值的文本表示时,java.time类默认使用ISO 8601 .
Instant类表示UTC中时间轴上的一个时刻,分辨率为nanoseconds . 该类可以直接解析输入字符串,而无需定义格式化模式 .
关于java.time
java.time框架内置于Java 8及更高版本中 . 这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date,Calendar和SimpleDateFormat .
现在位于maintenance mode的Joda-Time项目建议迁移到java.time类 .
要了解更多信息,请参阅Oracle Tutorial . 并搜索Stack Overflow以获取许多示例和解释 . 规格是JSR 310 .
从哪里获取java.time类?
Java SE 8,Java SE 9,以及之后
内置 .
具有捆绑实现的标准Java API的一部分 .
Java 9增加了一些小功能和修复 .
Java SE 6和Java SE 7
大部分java.time功能在ThreeTen-Backport中反向移植到Java 6和7 .
Android
更新版本的Android捆绑java.time类的实现 .
对于早期的Android,ThreeTenABP项目采用ThreeTen-Backport(如上所述) . 见How to use ThreeTenABP… .
ThreeTen-Extra项目使用其他类扩展java.time . 该项目是未来可能添加到java.time的试验场 . 您可以在此处找到一些有用的类,例如Interval,YearWeek,YearQuarter和more .
不确定Java解析,但那是ISO8601:http://en.wikipedia.org/wiki/ISO_8601
还有其他方法可以解析它而不是第一个答案 . 要解析它:
(1)如果要获取有关日期和时间的信息,可以将其解析为
ZonedDatetime
(自 Java 8 )或Date
(旧)对象:要么
(2)如果您不关心日期和时间,只想将信息视为以纳秒为单位的时刻,那么您可以使用
Instant
:解决此问题的简单方法是将 "T" 替换为 " " 并删除 .384Z .
以下是如何实现这一目标的说明: