5

PostgreSQL 列の timezone のタイムスタンプタイプのタイムゾーン値を読み取る方法が見つかりません。

JDBC はメソッドjava.sql.ResultSet#getTimestamp(int, java.util.Calendar) を提供していますが、独自のカレンダーを提供する必要があります。私が読んでいるタイムスタンプフィールドからそのカレンダーを取得する方法がわかりません。

複数のタイムゾーンの時間データを保存するシステムに取り組んでいます。タイムゾーン情報を含むデータを保存し、データベースからそのタイムゾーンを読み取ることができるようにする必要があります。

のようなハックなしで可能ですか

  • タイムゾーン値を別のフィールドに保存する
  • 「Wed 17 Dec 07:37:16 1997 PST」のように、日付を文字列として保存する

JDBC 41 (JDBC4 Postgresql ドライバー、バージョン 9.4-1201)、Java 8 を使用しています。

4

2 に答える 2

7

ここの PostgreSQL のドキュメントには、次のように書かれています。

の場合timestamp with time zone、内部に格納される値は常に UTC (Universal Coordinated Time、グリニッジ標準時 (GMT) として知られています) です。

したがって、「[タイムスタンプ値に対応する] タイムゾーンを保存する」必要はありませ。値はtimestamp with time zone常に UTC として保存されます。

また、「タイムスタンプ フィールドからカレンダーを取得する」必要はありません。Calendar の目的は、Java アプリケーションで使用する特定のタイムゾーンを定義することです。

言い換えれば、timestamp with timezoneさまざまなタイムゾーン (たとえば、一部は EST、他は PST など) の値を保存せず、タイムスタンプ値が挿入されるときにすべてを UTC に変換します。

于 2015-06-11T18:32:29.687 に答える
4

受け入れられた答えは真実で正確です。時間タイプのタイムスタンプは、タイムゾーン情報をフィールドに保存せず、抽出することはできません。

タイムスタンプのタイムゾーンに関心がある場合は、個別に (他のフィールドまたはカスタム列タイプに) 保存する必要があります。

一見、関数extract(timezone from field)を使用してタイムスタンプ with タイムゾーンからタイムゾーンを抽出できるように見えますが、そうではありません。

その関数は、「秒単位で測定された、UTC からのタイムゾーンオフセット」を提供するだけです。重要な (ドキュメントには記載されていません) 部分は、オフセットが現在のタイムゾーン(セッション SET SESSION TIME ZONE によって設定されるか、設定されていない場合はサーバーのタイムゾーン) から測定されることです。フィールドを保存するときに使用されたのはオフセットではありません。

于 2015-06-11T19:44:11.480 に答える