2017-02-15 11 views
2

GMT + 1タイムゾーンにあり、long変数にUTCタイムスタンプ(11:12:56)があります。UTCタイムスタンプ - > java.sql.Timestamp - > jOOQ - > postgreSQLのローカルタイムスタンプ?

long ts = 1487157176450; 

私はこのタイムスタンプからjava.sql.Timestampを初期化します。

Timestamp timestamp = new Timestamp(ts); 

次に、このタイムスタンプをjOOQを使用してPostgreSQL(v9.4)データベースに挿入します。

create.insertInto(TABLE, 
    TABLE.NAME, TABLE.TS) 
    .values("Foo bar", timestamp); 

しかし、私は実際のSQLコマンドが実行ログインしてきたとき、私はこれを見た:

< 2017-02-15 10:50:37.326 CET >LOG: execute <unnamed>: insert into "database"."table" ("name", "ts") values ($1, cast($2 as timestamp)) 
< 2017-02-15 10:50:37.326 CET >DETAIL: parameters: $1 = 'Foo bar', $2 = '2017-02-15 12:12:56.450' 

私はタイムスタンプがローカルのものになってますたところ全くわからないんだけど、しない限り、 pgAdminは、私が実際に意図したUTCではなく、データベースにGMT + 1のタイムスタンプを格納しています。

JDBCを使用していないため、リンクされた質問に対する回答は役に立ちません。 jOOQに正しいタイムスタンプを保存させるにはどうすればいいですか?

+0

あなたのクライアントのタイムゾーンをUTCに設定するか、明示的なキャスト 'cast($ 2 as timestamptz) 'を使用することができます。 –

+0

JDBC仕様では、1)明示的に指定されていない限り、JVMのデフォルトタイムゾーンでタイムスタンプを送信する必要があります。正しいタイムゾーンで 'Calendar'を渡し、2)特定のタイムゾーンの列に挿入する、3)' java.time.OffsetDateTime'を使用する –

答えて

1

タイムスタンプクラス自体は、タイムゾーンに関するはありません。です。

つまり、入力値がUTCであることを前提としています。

タイムスタンプをさらに処理すると(特に何も設定されていない)、Timestampオブジェクトから「取得」され、データベースにプッシュされた値は、現在のロケールを考慮しています。

hereの詳細については、ご覧ください。 Mikael Valotの答えには、longの値を取得してタイムゾーンのコンストラクタに渡す方法の例がいくつか示されています。

+0

右、どうすればjOOQに伝えることができますか?タイムスタンプを現在のロケールに変換しますか? –

+0

@TomášM。 https://blog.jooq.org/tag/time-zones/とhttp://stackoverflow.com/questions/27913735/jooq-timestamp-being-stored-with-local-timezone-offset –

+1

@TomášMも参照してください。 :これはjooq(JDBCに 'Timestamp'を渡すだけではなく)に関連していますが、JDBC/PostgreSQLの問題です。 PostgreSQLのデータ型として 'timestamp with time zone'を使い、' java.time.OffsetDateTime'にマップするために、正しいデータ型バインディングをjOOQに適用したいと考えています –

関連する問題