Zona waktu PostgreSQL tidak cocok dengan zona waktu sistem

17

Saya memiliki beberapa instalasi PostgreSQL 9.2 di mana zona waktu yang digunakan oleh PostgreSQL adalah GMT, meskipun keseluruhan sistemnya adalah "Eropa / Wina". Aku mengecek bahwa postgresql.conftidak tidak mengandung timezonepengaturan, sehingga menurut dokumentasi itu harus mundur ke zona waktu sistem.

Namun,

# 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)

Ada petunjuk, dari mana zona waktu GMT bisa berasal? Pengguna sistem tidak TZmengatur dan /etc/timezonedan /etc/timeinfotampaknya dikonfigurasi dengan benar.

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

Ada petunjuk yang dihargai, terima kasih sebelumnya!

Martin C.
sumber

Jawaban:

24

Nilai default untuk TimeZonepengaturan telah berubah pada rilis 9.2:

(..) Jika tidak diatur secara eksplisit, server menginisialisasi variabel ini ke zona waktu yang ditentukan oleh lingkungan sistemnya. (...)

(...) Default bawaan adalah GMT, tapi itu biasanya ditimpa di postgresql.conf; initdb akan menginstal pengaturan yang sesuai dengan lingkungan sistemnya. (...)

Yang berarti bahwa sebelum versi 9.2 nilai default di postgresql.confharus ditetapkan selama initdbfase. Jika Anda mengganti nilai itu (mungkin menyalin yang lama postgresql.confsambil memutakhirkan dari versi yang lebih lama) PostgreSQL akan menggunakan nilai "GMT" sebagai default.

Solusi untuk kasus Anda cukup sederhana, cukup ubah TimeZonepengaturan postgresql.confke nilai yang Anda inginkan:

TimeZone = 'Europe/Vienna'

Setelah itu Anda perlu ke reloadlayanan:

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

Maka semua bidang yang disimpan sebagai timestamp with time zone(atau timestamptz) akan ditampilkan dengan benar mulai sekarang. Tetapi Anda harus memperbaiki dengan tangan semua (perbarui) bidang yang disimpan sebagai timestamp without time zone(atau timestamp).

Kiat yang saya berikan kepada semua orang yang mengupgrade PostgreSQL bukan untuk menyalin yang lama postgresql.confke cluster baru (perhatikan, saya tidak yakin apakah itu yang Anda lakukan, tapi saya melihat masalah yang sama karena itu). Hanya dapatkan yang dihasilkan oleh initdbdan tambahkan modifikasi ( diffalat mungkin sedikit untuk tugas ini).

MatheusOl
sumber
Terima kasih banyak, saya tidak melihat perubahan ini dari 9,1 menjadi 9,2. Ya, menambahkan info zona waktu ke postgresql.conf adalah perbaikan yang sepele, saya tidak bisa menjelaskan mengapa ini akan kembali ke GMT. Tampaknya saya hanya menemukan dokumentasi 9,1 sepanjang waktu, karena saya tidak akan mengharapkan perubahan radikal dari 9,1 menjadi 9,2 dalam perilaku default.
Martin C.
Database Anda harus selalu dalam UTC (GMT). Membuat waktu lebih mudah untuk dibandingkan. Selalu dapat mengubah zona waktu klien / sesi. Tetapkan zona waktu x dalam hal. stackoverflow.com/questions/2532729/…
Neil McGuigan
Apakah ada cara untuk menentukan postgresql.confversi 9.2+ bahwa zona waktu lingkungan sistem masih harus terdeteksi secara otomatis?
Kyle Strand
0

Saya menemukan solusi untuk ini.

cukup buat symlink di dalam / usr / share / zoneinfo / bernama localtime (atau nama apa pun yang Anda inginkan) untuk diarahkan ke / etc / localtime

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

dengan cara ini Anda membuat serangkaian tautan yang pada akhirnya menunjuk pada zona waktu sistem Anda.

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

Sekarang mengambil nama dari link yang Anda buat ( localtime dalam kasus saya) dan menggunakannya sebagai nilai dari item konfigurasi di postgresql.conf

TimeZone = 'localtime'

restart postgresql dan periksa waktu dengan "SELECT now ();" dan "tampilkan zona waktu;"

MatteoBee
sumber