(私はUTC + 2タイムゾーンにいます。これは2時間の違いだと思います)。
私は Grails アプリケーションの一部である JSON RESTful API を書くのに忙しくしています (特にこのプロジェクトでは 2.0.3 ですが、この問題は他のバージョンでも発生します)。Json のシリアル化と逆シリアル化に Jackson を使用します。JsonService の構成は次のようになります: http://pastebin.com/JacytMuF
そのため、複数の Domain オブジェクトの値が照合され、単一の DTO (この場合は単純なマップ) で表されます。これらは JsonService に渡されて Json に変換され、(リクエストに) 返されます。2 時間ずれている (いくつかの) 日付のうちの 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 時間がマジック ナンバーである理由 (タイムゾーンの違い) はわかりますが、一部のオブジェクト (または実際には Date オブジェクトの一部のサブセットのみ) で Date がオフセットされている理由を説明できません。