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

时间:2015-04-15 19:19:43

标签: java scala date iso8601

我在Scala中使用了这段代码,使用了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)不同的值(后三位数不同)。但是,如果您解析格式化更多次的相同字符串,它们总是返回它应该返回的初始日期。

为什么呢?一个bug?有什么想法解决它吗?

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

1 个答案:

答案 0 :(得分:0)

  

我必须支持Java日期,请不要推荐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