(我在 UTC+2 时区,我认为这是 2 小时的差异)。
我正忙着编写一个 JSON RESTful API,它是 Grails 应用程序的一部分(特别是这个项目上的 2.0.3,但这个问题出现在其他版本中)。我使用Jackson进行Json的序列化和反序列化,JsonService的配置如下:http ://pastebin.com/JacytMuF
因此,多个 Domain 对象具有在单个 DTO 中整理和表示的值(在这种情况下,它是一个简单的映射),这些只是传递给 JsonService 以转换为 Json,然后返回(到请求)。所有字段都已正确序列化,但(几个)日期中的两个除外,它们相差 2 小时。例如,我可以运行:
db_dev=# select next_billing_date from account where code = 'CATS001';
next_billing_date
---------------------
2013-06-20 00:00:00
并且通过这个小动作验证这是正确的(在记忆中)
def checkTimezone() {
Account acc = Account.findByCode("CATS001")
log.error(acc.nextBillingDate)
}
返回
ERROR mash.TestController - 2013-06-20 00:00:00.0
正如预期的那样。此外,我可以通过在 RestAccountController 中执行以下操作来检查内存中的值是否被篡改:
def show() {
...
def ans = [ code: ac.code, nextBillingDate: ac.nextBillingDate ]
log.error("CATTTTSSSSSSSSSSSSSS::::: ${ac.nextBillingDate}")
[ans: ans]
}
(返回)
ERROR mash.RestAccountController - CATTTTSSSSSSSSSSSSSS::::: 2013-06-20 00:00:00.0
然而,当我到达相关端点时,我得到:
nextBillingDate": "2013-06-19T22:00:00.000+0000"
关闭 2 小时。nextBillingDate 属性是一个普通的 Java Date 对象,底层数据库是 psql:
next_billing_date | timestamp without time zone | not null | plain |
因此,我对为什么随机扣除 2 小时有点迷茫。我可以看到为什么 2 小时是神奇的数字(时区差异),但我无法解释为什么它会抵消某些对象上的日期(或者实际上只是在日期对象的某些子集上)。