ISO 8601
作为一对夫妇提到的其他答案的,有问题的日期 - 时间格式由RFC 4517 Lightweight Directory Access Protocol (LDAP): Syntaxes and Matching Rules定义。参见3.3.13节,通用时间。
该部分解释此LDAP格式是由ISO 8601定义的日期时间格式之一的受限制版本。使用最小隔板这种风格被称为“基本”在ISO 8601
在这些格式,在端的Z
是短期的和Zulu
意味着UTC(基本上为GMT相同)。
小数点和末尾的数字代表一秒的小数部分。请注意,在RFC 4517和ISO 8601中都可以使用逗号而不是点(句点)。逗号实际上是在ISO 8601中的点上推荐的。RFC 4517规范仅允许使用单个数字分数(分数的十分之一)或没有点/逗号&数字。请注意,相比之下:(a)ISO 8601允许使用任意数量的小数位数,并且(b)java.time对象具有纳秒级分辨率,分辨率最高可达9位数。
java.time
的java.time框架是建立在Java 8和更高版本。这些课程取代了老的麻烦日期时间课程,如java.util.Date
,.Calendar
,& java.text.SimpleDateFormat
。
现在在maintenance mode,Joda-Time项目也建议迁移到java.time。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。
大部分java.time功能都被移植到Java7中ThreeTen-Backport,并进一步适用于Android的ThreeTenABP。
ThreeTen-Extra项目扩展java.time与其他类。这个项目是未来可能增加java.time的一个试验场。
解析
定义的格式设置模式以适合RFC 4517.研究的DateTimeFormatter
类的图案编码。这应该工作:uuuuMMddHHmmss[,S][.S]X
。方括号表示可选。我们适应点或逗号。注意秒数部分的单数。最后的X
允许Z
或offset-from-UTC,例如-08或-0830或-08:30或-083015或-08:30:15。
String input = "20090813145607.0Z";
DateTimeFormatter f = DateTimeFormatter.ofPattern ("uuuuMMddHHmmss[,S][.S]X");
OffsetDateTime odt = OffsetDateTime.parse (input , f);
Instant instant = odt.toInstant();
转储到控制台。
System.out.println ("input: " + input + " | odt: " + odt + " | instant: " + instant);
输入:20090813145607。0Z | odt:2009-08-13T14:56:07Z |即时:2009-08-13T14:56:07Z
当然,你也应该编码检查java.time.format.DateTimeParseException
在意外输入的情况下。
我不知道什么.0Z'的'的确切含义是和日期从LDAP我不来了不知道未来会不会改变。我不知道还有什么值得期待的,但它应该是一个ldap标准,并符合其中一个rfcs。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms680924%28v=vs.85%29.aspx – 2012-03-21 14:24:53
NOPE - “.0”与时区没有任何关系。 “Z”表示祖鲁(UTC)时间 - 故事结束。秒后的“.0”表示小数秒。因此,中午过后五十九秒半的时间可能会看起来像“yyyymmdd120059.5Z”。有关更多详细信息,请参阅下面的@Basil Borrque的“ISO 8601”答案。 – 2017-08-01 02:11:47