我在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。)
答案 0 :(得分:0)
我必须支持Java日期,请不要推荐Joda-Time。
实际上,可以使用Joda-Time或java.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