Below is a deserialization of an ISO8601 date string that contains time zone information. Notice that the time zone information is lost:
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
Time zone information (UTC offset) is serialized, as in +03:00 and +02:00 at the end of the ISO8601 strings, but it is lost after deserialization. As you can see the date2 DateTime object, which I expected to be a copy of date1 has the system's UTC offset instead of +02:00, which date1 had.
How do I deserialize an ISO8601 string as to preserve the UTC offset?
The constructor you are using, new DateTime(Object instant), (actually passed through to BaseDateTime) doesn't parse, instead it converts the given object (in your case, a String).
Long story short, it uses the default time zone:
Instant and requests an InstantConverter from ConverterManager
getInstantMillis() on that StringConverter
DateTimeFormatter, however instead of parse it calls parseMillis().parseMillis, as you can see from the javadocs, returns a date in the default time zone.Use DateTime.parse instead:
DateTime date2 = DateTime.parse(date1.toString());
// 2013-09-22T19:21:48.461+02:00
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With