Serialization 跨时区的JodaTime反序列化/序列化会中断代码

Serialization 跨时区的JodaTime反序列化/序列化会中断代码,serialization,deserialization,jodatime,Serialization,Deserialization,Jodatime,在部署到生产环境之后,我的代码崩溃了,在进行了大量的bug追踪之后,我发现JodaTime在生产环境中处理反序列化/序列化的方式与在开发环境中不同。显然值得注意的是,生产服务器位于另一个时区 开发时的反序列化和序列化: scala> val input = "2013-09-07T17:11:03.117+03:00" input: String = 2013-09-07T17:11:03.117+03:00 scala> val thisIsDev = new DateTime(

在部署到生产环境之后,我的代码崩溃了,在进行了大量的bug追踪之后,我发现JodaTime在生产环境中处理反序列化/序列化的方式与在开发环境中不同。显然值得注意的是,生产服务器位于另一个时区

开发时的反序列化和序列化:

scala> val input = "2013-09-07T17:11:03.117+03:00"
input: String = 2013-09-07T17:11:03.117+03:00

scala> val thisIsDev = new DateTime(input).toString()
thisIsDev: String = 2013-09-07T17:11:03.117+03:00

scala> input == thisIsDev
res3: Boolean = true
请注意ISO8601字符串末尾的
+03:00
,无论是最初还是重新序列化之后。现在这是在+0时区的生产中发生的情况:

scala> val sameInput = "2013-09-07T17:11:03.117+03:00"
sameInput: String = 2013-09-07T17:11:03.117+03:00

scala> val thisIsProd = new DateTime(sameInput).toString()
thisIsProd: String = 2013-09-07T14:11:03.117Z

scala> sameInput == thisIsProduction
res1: Boolean = false
如您所见,
+03:00
被免除,并且日期字符串的格式更改了时区

这个问题解决了吗?建议

编辑:

为了澄清这一点,问题是如果我序列化、更改时区(例如,转到其他服务器),然后反序列化和重新序列化,我最终得到的字符串与开始时不同。这就是为什么我的产品坏了,但我的测试没有。我花了一段时间才弄明白

注意:这些ISO8601字符串在CouchDb服务器上使用,CouchDb服务器按字母数字对它们进行排序,这就是为什么我不能使用JodaTime方法进行比较

编辑2:

理想情况下,答案将建议如何将ISO8601字符串反序列化为DateTime对象,而不丢失时区信息(在不同的时区上)


编辑2.1:

对于您编辑的问题,最简单的答案是强制每个datetime位于同一时区,例如

scala> new DateTime("2013-09-07T17:11:03.117+03:00").withZone(DateTimeZone.UTC)
res1: org.joda.time.DateTime = 2013-09-07T14:11:03.117Z

scala> new DateTime("2013-09-07T14:11:03.117Z").withZone(DateTimeZone.UTC)
res2: org.joda.time.DateTime = 2013-09-07T14:11:03.117Z

但是,请注意,在这种情况下,您将丢失信息,即日期所在的时区。如果您将日期用于内部目的(例如查找新项目),那么这并不重要。如果您将数据发送回用户,则需要找到其他解决方案。

此处没有足够的信息来了解实际问题所在。这两个时间都是相等的,如果您尝试
newdatetime(“2013-09-07T17:11:03.117+03:00”)。可以看到这两个时间相等(newdatetime(“2013-09-07T14:11:03.117Z”)
。请显示完整的错误信息和导致错误的代码。@jgm,作为回答,我更新了问题。