Java 无法解析的日期

标签 java parsing date simpledateformat

我有一个格式为: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表示当时区使用单个字母时,XISO 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/

相关文章:

java - 创建通知 channel (React Native)

postgresql - 如何将日期 ( YYYY-MM-DD ) 转换为 postgresql 中的月份?

java - F.A.B 隐藏但不显示

java - procrun stopservices 方法未正确执行

java - 是否有可能获得 putextra 的名称/标签?

c# - 如何从 C# 中的字符串中获取实例?

iOS - NSInternalInconsistencyException 'circular dependency when saving'

parsing - 如何从Aeson的Haskell中的Value中获取HashMap(Object)?

java - 使用不同的标准解析 Json 日期

JavaScript 动态日历