【问题标题】:Incorrect parsing of date strings in SimpleDateFormatSimpleDateFormat 中的日期字符串解析不正确
【发布时间】:2014-08-28 08:21:42
【问题描述】:

我正在尝试将 UTC 格式的字符串格式日期转换为日期对象,这会导致转换延迟几分钟。

SimpleDateFormat fullDateFormater = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS", Locale.US);
fullDateFormater.setTimeZone(TimeZone.getTimeZone("UTC"));

在解析日期字符串之前是-2014-07-07T18:24:23.788810

解析后日期为Tue Jul 08 00:07:31 GMT+05:30 2014

正确的日期转换为Tue Jul 07 23:54:23 GMT+05:30 2014

转换有大约 12-13 分钟的差异。我观察到转换在 10 分钟范围内的差异。

知道出了什么问题吗?

【问题讨论】:

  • 你输入的字符串日期是什么

标签: java android sql date


【解决方案1】:

SSSSSS 正在解析毫秒数 - 而不是您所期望的微秒。

788810 毫秒是 13 分 8 秒和 810 毫秒。所以你的结果实际上是 2014-07-07T18:27:31.810。

是的,这是一个非常愚蠢的 API 设计。 S...S 表示“几分之一秒”而不是“毫秒”会让更加更有意义——但这远不是 Java-8 之前的日期/时间 API 最糟糕的事情: (

我不认为有一种方法可以用 SimpleDateFormat 解析微秒 - Java-8 之前的 Java 时间 API 的精度无论如何都是毫秒 - 所以我认为你只需要用substring 去掉最后三位数字,并在格式字符串末尾使用SSS 对其进行解析。

如果您使用的是 Java 8,我强烈建议您使用 java.time,我确信它可以处理这种情况。 (我没有看过它的解析API,但我相信它会没事的。)

【讨论】:

  • 谢谢!我几乎记得我以前遇到过这个问题。我刚刚放弃了毫秒部分。尚未使用 Java 8。感谢'java.time'。
  • 确实 java.time 解析 API 很好,并且可以正确处理“秒的小数部分”(0 到 9 位)而不是“毫秒”。我热烈推荐它。查看DateTimeFormatter 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多