2013-05-21 52 views
3

(我在UTC + 2時區,我認爲是2小時的差異)。傑克遜序列化有時與時區borking

我正忙於編寫一個JSON RESTful API,它是Grails應用程序的一部分(特別是2.0.3在此項目中,但在其他版本中會發生此問題)。我用傑克遜的序列化和JSON反序列化,以及JsonService的配置是這樣的:http://pastebin.com/JacytMuF

那麼多域對象都整理,並在一個單一的DTO(在這種情況下,它是一個簡單的地圖)爲代表的價值觀,而這些都只是傳遞給JsonService以轉換爲Json,該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個小時的幻數(時區差異),但我無法解釋爲什麼它(僅適用於日期對象的某個子集或確實)抵消一些對象的日期。

+1

看看這個,如果它是任何靈感的來源:[http://stackoverflow.com/questions/15734768/jqgrid-date-formatter-not-applying-local-time-offset-correctly-grails] (http://stackoverflow.com/questions/15734768/jqgrid-date-formatter-not-applying-local-time-offset-correctly-grails) – lucke84

+0

我建議你使用你在''SimpleDateFormat''中聲明的'SimpleDateFormat''', JsonService'來打印你的調試。 –

回答

1

幾項檢查:

  1. 是您的JVM默認設置爲UTC時區?
  2. 是數據庫行UTC中的時區嗎?在你的情況下,我不認爲db關心時區。

選項:

如果JVM的默認設置爲UTC的話,你會看到2個小時的偏移量。爲了讓您的區timestap這是UTC+2:00您可以在Bootstrap.groovy

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

說明如下圖所示設置默認的時區,以您的區域: -參考GMT vs UTC找到差異。