json - jackson 序列化有时会厌倦时区

标签 json grails jackson

(我在 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 对象的某些子集上)偏移日期。

最佳答案

需要检查的几件事:

  1. 您的 JVM 是否默认设置为 UTC 时区?
  2. 数据库行中的时区是 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/

相关文章:

java - 如何格式化 json 字符串?

java - 嵌入式 Neo4j Java 节点和关系对象到 JSON

php - json到数组到mysql不循环数据

Java 或 Scala。如何将\x22 之类的字符转换为 String

hibernate - 刷新模式在 grails 中从 AUTO 更改为 MANUAL

java - 考虑从 Java/Spring MVC 迁移到 Grails

java - Jackson readTree() 忽略 null 和空值

grails - 从 View 向 Controller 发送参数时, Controller 没有属性

java - Spring返回List时预期 ':'而不是 't'错误?

java - Jackson jsonidentityinfo 反序列化失败