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 对象具有纳秒分辨率,最多可显示九位小数秒。
java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date、.Calendar 和java.text.SimpleDateFormat。
现在在maintenance mode,Joda-Time 项目也建议迁移到 java.time。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。
大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。
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 的代码,以防出现意外输入。