5

PostgreSQL を中心とした開発環境全体がローカル タイムゾーンを台無しにしないようにするにはどうすればよいですか。簡単にするために、すべての時刻 (スタンプ) の値が UTC であることを 100% 確認する必要があります。timestamp without time zone関数を使用して (!) を含む行を挿入したときCURRENT_TIMESTAMP、タイムゾーン情報を指定したことがなかったにもかかわらず、そうではないことに気付きました。

タイムゾーンを取り除くのに役立つステップバイステップのマニュアルはありますか?

4

4 に答える 4

3

これにはまず理解が必要です。ここで、PostgreSQL がタイムスタンプとタイムゾーンを処理する方法について包括的な回答を書きました:
Rails と PostgreSQL でタイムゾーンを完全に無視する

タイムゾーンを「持たない」ことはできません。type で操作できますtimestamp [without time zone]が、クライアントにはまだタイムゾーンがあります。

あなたの声明:

timestamp without time zone関数を使って(!)で行を挿入するとCURRENT_TIMESTAMP……

adjecto の矛盾です。(!)CURRENT_TIMESTAMPを返します。timestamp with time zoneにキャストする (または自動的に強制する)timestamp [without time zone]と、タイム ゾーン オフセットは適用されずに切り捨てられます。UTC の代わりに、(セッションの現在のタイム ゾーン設定が何であれ) 現地時間を取得します。検討:

SELECT CURRENT_TIMESTAMP AT TIME ZONE 'UTC'
      ,CURRENT_TIMESTAMP::timestamp

ローカル タイム ゾーンの設定が「UTC」または「ロンドン」のようなものでない限り、2 つの式は異なる値を返します。

タイム ゾーンで表示されるリテラル値を保存する場合は、次のいずれかを使用します。

SELECT CURRENT_TIMESTAMP::timestamp
      ,now()::timestamp
      ,LOCALTIMESTAMP;

UTC で表される時点を保存する場合は、次のいずれかを使用します。

SELECT CURRENT_TIMESTAMP AT TIME ZONE 'UTC'
      ,now() AT TIME ZONE 'UTC;
于 2013-05-02T00:46:06.417 に答える
2

あなたは大きな誤解の犠牲になっています:タイムスタンプにはタイムゾーン情報が含まれていません! 詳細については、こちらの他の回答を参照してください。つまり、開発環境全体ですでにタイム ゾーンが使用されていません。確実にする必要がある唯一のことは、時間のテキスト表現がタイム スタンプに変換されるとき (およびその逆)、変換を行うものが、テキスト表現がどのタイム ゾーンで表現されたかを認識していることです。それ以外の場合は、タイム ゾーン無関係です。

これはサンのせいだ!Date彼らは、タイムスタンプ オブジェクト自体の内部にタイム スタンプをテキストに変換するメソッド (最初に を使用して、次に を使用して)を含めると、開発者にとって便利であると考えましたCalendar。この変換にはタイム ゾーンが必要なため、同じクラスにタイム ゾーンを格納すると非常に便利であると考えられたため、変換を行うたびにタイム ゾーンを渡す必要がなくなりました。これにより、これまで Java で最も広まった (そして有害な) 誤解の 1 つが助長されました。他の言語で開発している人々が何を言い訳にしているのか、私にはわかりません。多分彼らはただ愚かです。

于 2013-05-02T00:54:49.733 に答える
0

日付列を「timestamptz」または「timestamp with time zone」と宣言します。

タイムスタンプが保存されていない既存のデータの変換についても質問していますか?

于 2013-05-01T23:25:27.903 に答える