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