3

Postgresテーブルにタイムスタンプを挿入するコードがあります。タイムスタンプが挿入されるフィールドの定義は次のとおりです。

datelast timestamp without time zone

このJavaコードを使用して、フィールドのデータを更新します。

PreparedStatement sqlStatement = connection.prepareStatement(
        "UPDATE datetest SET datelast = ? WHERE id = ? ");
    sqlStatement.setTimestamp(1, new java.sql.Timestamp((new Date()).getTime()));
    sqlStatement.setInt(2, 1);
    sqlStatement.executeUpdate();

私の問題は、ローカルタイムスタンプ(東部標準時)の代わりにUTCタイムスタンプが挿入されることです。したがって、テーブルのデータを確認すると、「2010-02-08 14:07:21.261」ではなく「2010-02-0819:07:21.261」が表示されます。

実際、私はこのコードを実行していましたが、古いサーバーで実行したいのですが、コードを移行した後、その問題が発生しました。私はまだ同じDBを使用しているので、問題はPostgresではありません。OSのタイムゾーンも確認しましたが、同じです。また、「System.out.println( "TZ =" + TimeZone.getDefault());」も試してみました。両方のサーバーで同じタイムゾーンを取得します。したがって、私の結論は、JDBCドライバーが日付をUTCで変換してから、テーブルに挿入しているということです。

タイムスタンプが変換される理由を誰かが理解するのを手伝ってもらえますか?

ありがとう

4

3 に答える 3

3

Paul Claphamが言及しているように、postgresは実際に常にタイムスタンプ値をUTCで保存します

タイムゾーン付きのタイムスタンプの場合、内部に保存される値は常にUTC(協定世界時、従来はグリニッジ標準時、GMTとして知られています)です。明示的なタイムゾーンが指定されている入力値は、そのタイムゾーンに適切なオフセットを使用してUTCに変換されます。入力文字列にタイムゾーンが指定されていない場合は、システムのタイムゾーンパラメータで指定されたタイムゾーンにあると見なされ、タイムゾーンゾーンのオフセットを使用してUTCに変換されます。

タイムゾーン値を含むタイムスタンプが出力されると、常にUTCから現在のタイムゾーンゾーンに変換され、そのゾーンの現地時間として表示されます。別のタイムゾーンの時刻を確認するには、タイムゾーンを変更するか、AT TIME ZONEコンストラクトを使用します(セクション9.9.3を参照)。

マニュアルのこのセクションは参照してtimestamp with timezoneいますが、同じ内部ストレージがwithout timezone

于 2010-02-08T20:08:09.653 に答える
1

「テーブルのデータを確認してください」と言うとき、データベース表示ツールを使用していると思いますか?これらの値をどのように取得しているかを知ることは役に立ちます。

データベースに値がUTCとして内部的に格納されていることを知っても驚くことではありません。その場合、選択したタイムゾーンでデータを表示するためにデータを抽出するのはソフトウェア次第です。実際、デフォルトのタイムゾーンを変更する(またはデータベースを別のデフォルトの別のサーバーに移動する)ため、データベースサーバーのデフォルトのタイムゾーンに依存するものとしてデータが内部に保存されることは期待できません。 )すべてのデータを変更します。それは悪いことです。

于 2010-02-08T19:56:15.443 に答える
1

私の問題はPostgresのJARファイルに関連していました。

古いサーバーでは、Postgres 7 JARファイルを使用していて、すべてが正常に機能していました。何らかの理由で、新しいサーバーでは機能しなくなりました。JARファイルをPostgres8ファイルに置き換えましたが、すべてが正常に機能しています。DBにタイムスタンプを挿入すると、GMT時間ではなく、現地時間が挿入されるようになりました。

皆さんの助けに感謝します。

于 2010-02-09T14:17:39.293 に答える