Json 杰克逊有时会与时区发生冲突

Json 杰克逊有时会与时区发生冲突,json,grails,jackson,Json,Grails,Jackson,(我在UTC+2时区,我假设是2小时的时差) 我正忙于编写一个JSON RESTful API,它是Grails应用程序的一部分(特别是在本项目中为2.0.3版本,但这个问题在其他版本中也会出现)。我使用Jackson对Json进行序列化和反序列化,JsonService的配置如下所示: 因此,多个域对象的值在单个DTO中进行了整理和表示(在本例中,它是一个简单的映射),这些值只是传递给JsonService以转换为Json,然后返回(请求)。所有字段都已正确序列化,但有两个(多个)日期除外,它

(我在UTC+2时区,我假设是2小时的时差)

我正忙于编写一个JSON RESTful API,它是Grails应用程序的一部分(特别是在本项目中为2.0.3版本,但这个问题在其他版本中也会出现)。我使用Jackson对Json进行序列化和反序列化,JsonService的配置如下所示:

因此,多个域对象的值在单个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]
    }
(返回)

然而,当我到达相关终点时,我得到:

nextBillingDate": "2013-06-19T22:00:00.000+0000"
这是两个小时的休息时间。nextBillingDate属性是一个普通的Java日期对象,底层数据库是psql:

next_billing_date           | timestamp without time zone | not null  | plain    | 
因此,我有点不明白为什么随机扣除2小时。我可以理解为什么2小时是一个神奇的数字(时区差异),但我无法解释为什么它会在某些对象上抵消日期(或者实际上仅在日期对象的某些子集上)。

需要检查的几件事:

  • JVM是否默认设置为UTC时区
  • 数据库行中的时区是否为UTC?在你的情况下,我认为db不关心时区
  • 选项:

    如果JVM默认设置为UTC,则会看到2小时的偏移量。为了在您的区域中获得时间点击,即
    UTC+2:00
    ,您可以在
    Bootstrap.groovy

    TimeZone.setDefault(TimeZone.getTimeZone(“GMT+2:00”))


    注意:-请参阅查找差异

    如果这是灵感的来源,请看一看:我建议您使用您在
    JsonService
    中声明的相同
    SimpleDateFormat
    来打印调试。
    next_billing_date           | timestamp without time zone | not null  | plain    |