将ISO8601转换为DateTime并保留时区信息

以下是包含时区信息的ISO8601日期字符串的反序列化。 请注意,时区信息丢失:

scala> val date1 = new DateTime().withZone(DateTimeZone.forID("Europe/Berlin"))
date1: org.joda.time.DateTime = 2013-09-22T18:42:15.348+02:00

scala> date1.getZone()
res45: org.joda.time.DateTimeZone = Europe/Berlin

scala> val date2 = new DateTime(date1.toString())
date2: org.joda.time.DateTime = 2013-09-22T19:42:15.348+03:00

scala> date2.getZone()
res46: org.joda.time.DateTimeZone = Europe/Vilnius

scala> date1.getZone() == date2.getZone()
res47: Boolean = false

时区信息(UTC偏移)被序列化,如ISO8601字符串末尾的+03:00+02:00 ,但在反序列化后丢失。 正如你所看到的date2 DateTime对象,我预计是date1的副本,系统的UTC偏移量而不是+02:00 ,哪个date1有。

如何反序列化ISO8601字符串以保留UTC偏移量?


您正在使用的构造函数, new DateTime(Object instant) (实际传递给BaseDateTime )不会解析,而是转换给定的对象(在您的情况下为String )。

长话短说,它使用默认时区:

  • 构造函数将传入的参数视为Instant并从ConverterManager请求InstantConverter
  • 构造函数在该StringConverter上调用getInstantMillis()
  • 该方法实际上使用标准的ISO 8601 DateTimeFormatter ,但不是parse它调用parseMillis()
  • 正如您从javadocs中看到的parseMillisparseMillis会在默认时区中返回一个日期。
  • 改用DateTime.parse

    DateTime date2 = DateTime.parse(date1.toString());
    // 2013-09-22T19:21:48.461+02:00
    
    链接地址: http://www.djcxy.com/p/46639.html

    上一篇: ISO8601 to DateTime with time zone information preserved

    下一篇: ASP.NET membership returning DateTime with Kind set to Local