我有一个格式为:String dateString = "2014-03-17T20:05:49.2300963Z"
试试这个:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSSX");
Date date = df.parse(dateString);
导致无法解析日期
异常。
文档:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html表示当时区使用单个字母时,X
与 ISO 8601
一起使用。
编辑
重新阅读文档,我稍微改变了 SimpleDateFormat
:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
dateString = dateString.replace("Z", "");
我取出 Z
因为我知道时区,使用 H
而不是 k
并添加更多 S
咯咯笑。
现在正在解析,但错误。日期是准确的,时间似乎是随机的。
编辑2
问题是java只允许毫秒精度,因此2300963
被解释为2300秒和963毫秒。我需要稍微不同地设置字符串格式才能使其正常工作。
编辑3 事实证明,在 Java 中不能有秒的小数部分。它必须被截断为毫秒。我最终使用了数据库提供的类型,但一般的解决方案是将秒的小数部分截断为毫秒。我将发布如何执行此操作的示例代码作为答案。
最佳答案
您需要提供与日期 String
中一样多的 S
。在本例中,7
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSSSSSSX");
这是必需的,因为否则 DateFormat
不知道毫秒在哪里结束以及时区在哪里开始。
另请注意,
2300963
作为毫秒值表示 2300 秒和 963 毫秒。为什么你会这样?为什么这些秒不是其相应位置的值的一部分?当 DateFormat
解析它时,它们将被添加。
关于Java 无法解析的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22464594/