3

(私は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 がオフセットされている理由を説明できません。

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 に答える