在java中解析ISO 8601日期时出现奇怪的错误

在java中解析ISO 8601日期时出现奇怪的错误,java,scala,date,iso8601,Java,Scala,Date,Iso8601,我在Scala中使用了以下Java代码片段: 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

我在Scala中使用了以下Java代码片段:

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
这与标准不同,因为我实现的是一个修改版本,没有与UTC的偏移量,因为XML-RPC(我正在实现的协议)使用这种格式

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

为什么??虫子?有没有办法把它修好

(我正在为Scala做一个库,我必须支持Java日期,请不要推荐。)

我必须支持Java日期,请不要推荐Joda时间

实际上,您可以在保持与java.time.Date兼容的同时使用或

使用Joda Time或java.Time进行重物搬运。最后,转换为java.util.Date

java.util.Date date = dateTime.toDate();  // Easily convert to a java.util.Date instance.
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 );
跑步的时候

输入:20150123T12:34:56
日期时间:2015-01-23T12:34:56.000Z
日期:2015年1月23日星期五04:34:56太平洋标准时间

这看起来很奇怪-你能用一个简短但完整的Java程序重现它吗?您是否在多个线程中使用该格式?可能是因为您正在以秒为单位解析字符串,但以毫秒为单位输出。毫秒(最后3位)值用于实例化currentDate的时间。但这并不能解释dateParsed2和dateParsed3的输出。是的,@Sanj,我以为是这样,但当我检查dateParsed2和dateParsed3时,没有任何意义。@JonSkeet您希望我如何复制它?如果你愿意,我可以用正确的导入来做一个gist。我没有在多线程@JonSkeet中使用它,这个gist正在进行中。是的,我知道,我正在使用它,因为我必须同时支持Java日期和Joda时间日期。