(我在 UTC+2 时区,我假设是 2 小时时差)。
我正忙于编写一个 JSON RESTful API,它是 Grails 应用程序的一部分(特别是这个项目的 2.0.3,但这个问题出现在其他版本中)。我使用 Jackson 进行 Json 的序列化和反序列化,JsonService 的配置如下所示:http://pastebin.com/JacytMuF
因此多个域对象的值在单个 DTO 中整理和表示(在本例中它是一个简单的映射),这些只是传递给 JsonService 以转换为 Json,然后返回(给请求)。所有字段都正确序列化,但(几个)日期中的两个除外,它们相差 2 小时。例如,我可以运行:
db_dev=# select next_billing_date from account where code = 'CATS001';
next_billing_date
---------------------
2013-06-20 00:00:00
并且通过这个小 Action 验证这是正确的(在内存中)
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 小时是神奇的数字(时区差异),但我无法解释为什么它在某些对象上(或者实际上仅在 Date 对象的某些子集上)偏移日期。
最佳答案
需要检查的几件事:
- 您的 JVM 是否默认设置为 UTC 时区?
- 数据库行中的时区是 UTC 吗?在你的情况下,我认为数据库不关心时区。
选项:
如果 JVM 默认设置为 UTC,您会看到 2 小时的偏移量。为了获得您所在区域的时间戳,即 UTC+2:00
,您可以在 Bootstrap.groovy
TimeZone.setDefault(TimeZone.getTimeZone("GMT+2:00"))
注意:-引用GMT vs UTC找出不同之处。
关于json - jackson 序列化有时会厌倦时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16674943/