【问题标题】:Weird error when parsing ISO 8601 Date in java在 java 中解析 ISO 8601 日期时出现奇怪的错误
【发布时间】:2015-04-15 19:19:43
【问题描述】:

我在 Scala 中有这个 sn-p 代码,使用来自 Java 的 java.util.Date

val ISO8601Format = new SimpleDateFormat("yyyyMMdd'T'HH:mm:ss")
ISO8601Format.setLenient(false)

val currentDate = new Date()
val str = ISO8601Format.format(currentDate)
val dateParsed = ISO8601Format.parse(str)
val dateParsed2 = ISO8601Format.parse(str)
val dateParsed3 = ISO8601Format.parse(str)

println(currentDate.getTime)             // 1429124862000
println(dateParsed.getTime)              // 1429124862157
println(dateParsed2.getTime)      // 1429124862000
println(dateParsed3.getTime)     // 1429124862000

ISO 8601 与标准不同,因为我正在实施一个修改后的版本,没有从 UTC 偏移,因为 XML-RPC(我正在实施的协议)使用这种格式。

问题是第一个解析日期总是返回一个与初始日期(currentDate)不同的值(最后三位不同)。但是,如果您解析多次格式化的相同字符串,它们总是返回它应该返回的初始日期。

为什么?一个错误?有什么想法可以解决吗?

(我正在为Scala做一个库,我必须支持Java Dates,请不要推荐Joda-Time。)

【问题讨论】:

  • 这看起来很奇怪 - 你能用一个简短但完整的 Java 程序重现它吗?您是否在多个线程中使用该格式?
  • 可能是因为您正在以秒为单位解析字符串,但您以毫秒为单位输出。毫秒(最后 3 位)值用于实例化 currentDate 的时间。这并不能解释 dateParsed2 和 dateParsed3 的输出。
  • 是的,@Sanj,我以为是这样,但是当我检查 dateParsed2 和 dateParsed3 时,这没有意义。
  • @JonSkeet 你想让我如何重现它?如果你愿意,我可以用正确的进口做一个要点。
  • 我没有在多个线程中使用它@JonSkeet,这个要点正在路上

标签: java scala date iso8601


【解决方案1】:

我必须支持Java Dates,请不要推荐Joda-Time。

实际上,您可以使用Joda-Timejava.time,同时保持与java.time.Date 的兼容。

使用 Joda-Time 或 java.time 完成繁重的工作。然后,最后,转换为 java.util.Date。

Joda-Time 2.7 中的示例。

String input = "20150123T12:34:56";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyyMMdd'T'HH:mm:ss" ).withZoneUTC();
DateTime dateTime = formatter.parseDateTime( input );

现在从 Joda-Time 转换为 java.util.Date。

java.util.Date date = dateTime.toDate();  // Easily convert to a java.util.Date instance.

转储到控制台。

System.out.println( "input: " + input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "date: " + date );

运行时。

input: 20150123T12:34:56
dateTime: 2015-01-23T12:34:56.000Z
date: Fri Jan 23 04:34:56 PST 2015

【讨论】:

  • 是的,我知道并且正在使用它,因为我必须同时支持 Java 日期和 Joda-time 日期。
猜你喜欢
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多