2

データベースにいくつかの日付を保存するためにpostgresqlを使用しています。
私のアプリケーションでは、タイムゾーンを完全に認識していることが基本であり、クライアント、サーバー、およびデータベースの間でいくつかの基本的なテストを行っていました。

GWT で行ったブラウザーのアプリケーションから日付を送信し、postgresql で日付を読み取ります。

私のテスト:

クライアントは常に GMT タイムゾーンにあり、それぞれのケースで常に同じ日付を送信しています。
2012 年 4 月 13 日 00:00:00 GMT+00

posgres では、テストごとにタイムゾーンを変更しています。テストの合間に、テーブルからすべての日付を削除しています。

posgres のタイムゾーンを変更するには、{PostgreSQL HOME}\9.1\data\postgresql.conf でタイムゾーンを希望するタイムゾーンに設定します。

テスト: クライアント: 13/04/2012 00:00:00 GMT+00

1 回目のテスト - posgres EST - 12/04/2012 19:00:00-05 postgresql のドキュメントによるとEST = GMT - 5
2 回目のテスト - posgres GMT + 5 - 12/04/2012 19:00:00-05
3 回目のテスト - posgres GMT - 5 - 2012 年 4 月 13 日 05:00:00+05

ここで私の疑問が生じます。ドキュメントによると、EST = GMT - 5 です。では、なぜ逆に読んでいるのですか? ここで何か不足していますか?

私のテストの編集
技術的な側面: クライアントでこれを送信します: 2012 Apr 13 00:00:00 GMT+00.
サーバー上で、JDBC を使用してデータベースに書き込みます:
java.utils.date を java.sql.timestamp に変換します。

java.sql.Timestamp sqlTimeStamp = new java.sql.Timestamp(date.getTime());
(日付はクライアントからの java.utils.Date です)

準備されたステートメントを設定する
PreparedStatement ps = con.prepareStatement("INSERT INTO teste.dates (dates_tz, dates_ntz) VALUES (?, ?);"

ps.setTimestamp(1, sqlTimeStamp); ...

記録のために、これは私が理解したいことです.全体的に私の目的にはうまくいくので..

4

2 に答える 2

11

ドキュメントの警告を考慮してください:

心に留めておくべきもう 1 つの問題は、POSIX タイム ゾーン名では、グリニッジの西の場所に正のオフセットが使用されることです。それ以外の場所では、PostgreSQL は、正のタイムゾーン オフセットがグリニッジの東であるという ISO-8601 規則に従います。

あなたが見ているGMTへの反対の兆候は、まさにその発散の影響のようです. postgresql.conf で指定されたタイムゾーンは、おそらく POSIX ルールで解釈されますが、後で ISO-8601 ルール (誰もが実際に使用するルール) を使用して SQL によって表示されます。

于 2012-04-13T14:42:59.397 に答える
1

壁の時計が2012-04-13 00:00タイムゾーン「+5」で表示されている場合、ロンドンの時刻(GMTまたはUTC)は2012-04-12 19:00です。

米国にお住まいの場合、現地のタイムゾーンは「-5」の場合があります。真夜中になると05:00、ロンドンの朝になります。

それがまさにその通りです。PostgreSQLでのタイムゾーンの処理に関するこの詳細な回答は、理解に役立つ場合があります。

于 2012-04-13T11:54:21.570 に答える