PostgreSQLのタイムゾーンがシステムのタイムゾーンと一致しません


17

システム全体が「ヨーロッパ/ウィーン」であるにもかかわらず、PostgreSQLで使用されるタイムゾーンがGMTであるいくつかのPostgreSQL 9.2インストールがあります。設定が含まれてpostgresql.confないことを再確認したtimezoneため、ドキュメントによると、システムのタイムゾーンにフォールバックするはずです。

しかしながら、

# su -s /bin/bash postgres -c "psql mydb"

mydb=# show timezone;
 TimeZone 
----------
 GMT
(1 row)

mydb=# select now();
              now              
-------------------------------
 2013-11-12 08:14:21.697622+00
(1 row)

GMTタイムゾーンはどこから来るのでしょうか?システムの利用者は持っていないTZセットと/etc/timezoneし、/etc/timeinfo正しく設定されているように見えます。

# cat /etc/timezone 
Europe/Vienna
# date
Tue Nov 12 09:15:42 CET 2013

ヒントは大歓迎です、事前に感謝します!

回答:


24

TimeZone設定のデフォルト値はリリース9.2で変更されました。

(..)明示的に設定されていない場合、サーバーはこの変数をシステム環境で指定されたタイムゾーンに初期化します。(...)

(...)組み込みのデフォルトはGMTですが、通常はpostgresql.confで上書きされます。initdbは、システム環境に対応する設定をそこにインストールします。(...)

つまり、バージョン9.2より前でpostgresql.confは、initdbフェーズ中にデフォルト値を設定する必要があります。その値をオーバーライドした場合(おそらく、古いpostgresql.confバージョンからのアップグレード中に古いバージョンをコピーする)、PostgreSQLはデフォルトとして「GMT」値を使用します。

あなたの場合の解決策は非常に簡単で、TimeZone設定postgresql.confを必要な値に変更するだけです:

TimeZone = 'Europe/Vienna'

その後reload、サービスが必要になります。

# su - postgres -c "psql mydb -c 'SELECT pg_reload_conf()'"

その後、timestamp with time zone(またはtimestamptz)として保存されたすべてのフィールドは、今後正しく表示されます。ただし、timestamp without time zone(またはtimestamp)として保存されているフィールドをすべて手動で修正(更新)する必要があります。

PostgreSQLをアップグレードするすべての人に与えるヒントは、古いpostgresql.confクラスターを新しいクラスターにコピーしないことです(あなたが何をしたかはわかりませんが、そのためにこの同じ問題をよく見ました)。生成されたものを取得しinitdb、変更を追加するdiffだけです(このタスクにはツールが便利な場合があります)。


おかげで、9.1から9.2へのこの変更に気付かなかった。はい、タイムゾーン情報をpostgresql.confに追加するのは簡単な修正であり、GMTにフォールバックする理由を説明できませんでした。どうやら、デフォルトの動作で9.1から9.2へのそのような根本的な変更を期待していなかったので、私は常に9.1のドキュメントにつまずいたばかりです。
マーティンC.

ただし、データベースは常にUTC(GMT)である必要があります。時間を比較しやすくします。クライアント/セッションのタイムゾーンをいつでも変更できます。pgでタイムゾーンxを設定します。stackoverflow.com/questions/2532729/...
ニール・マクギガン

postgresql.confバージョン9.2+で、システム環境のタイムゾーンが自動的に検出されるように指定する方法はありますか?
カイルストランド

0

これの回避策を見つけました。

ただシンボリックリンクの内側の作成を/ usr / share / zoneinfoの/という名前のlocaltimeを指し示すことを(またはものは何でもあなたが望む名)の/ etc / localtimeの

/usr/share/zoneinfo/localtime -> /etc/localtime

このようにして、最終的にシステムのタイムゾーンを指すリンクの文字列を作成しています。

/etc/localtime -> /usr/share/zoneinfo/America/Los_Angeles

次に、作成したリンクの名前(私の場合はlocaltime)を取得し、postgresql.confの構成アイテムの値として使用します

TimeZone = 'localtime'

postgresqlを再起動し、「SELECT now();」で時間を確認します 「タイムゾーンを表示する」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.