3

(我在 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 小时是神奇的数字(时区差异),但我无法解释为什么它会抵消某些对象上的日期(或者实际上只是在日期对象的某些子集上)。

4

1 回答 1

1

几件事情要检查:

  1. 您的 JVM 默认设置为 UTC 时区吗?
  2. 数据库行中的时区是UTC吗?在你的情况下,我不认为 db 关心时区。

选项:

如果 JVM 默认设置为 UTC,您将看到 2 小时的偏移量。为了获得您所在区域的时间戳,UTC+2:00您可以通过如下方式将默认时区设置为您的区域Bootstrap.groovy

TimeZone.setDefault(TimeZone.getTimeZone("GMT+2:00"))

注意:-请参考GMT 与 UTC以找出差异。

于 2013-05-21T17:19:01.027 回答