zona waktu default postgres

99

Saya menginstal PostgreSQL 9dan waktu ditampilkan 1 jam di belakang waktu server.

Select NOW()Pertunjukan lari :2011-07-12 11:51:50.453842+00

Tanggal server menunjukkan: Tue Jul 12 12:51:40 BST 2011

Ini terlambat 1 jam tetapi zona waktu yang ditunjukkan di phppgadminadalah:TimeZone Etc/GMT0

Saya telah mencoba masuk ke postgresql.confpengaturan dan

zona waktu = GMT

lalu jalankan restart tapi tidak ada perubahan.

Ada ide yang saya pikir itu hanya akan menggunakan zona waktu server tetapi jelas tidak ?!

SOLUSI!: Saya sudah mengatur GMTsebelumnya dan itu satu jam di belakang. setelah mencari-cari ternyata saya perlu mengaturnya ke Europe/London. Ini memperhitungkan +1 jam di waktu musim panas Inggris, GMT tidak!

Menara Blu
sumber

Jawaban:

113

Zona waktu adalah parameter sesi. Jadi, Anda dapat mengubah zona waktu untuk sesi saat ini.

Lihat dok .

set timezone TO 'GMT';

Atau, lebih dekat mengikuti standar SQL, gunakan SET TIME ZONEperintah. Perhatikan dua kata untuk "ZONA WAKTU" dimana kode di atas menggunakan satu kata "zona waktu".

SET TIME ZONE 'UTC';

Doc menjelaskan perbedaannya:

SET TIME ZONE memperluas sintaks yang ditentukan dalam standar SQL. Standar hanya memungkinkan offset zona waktu numerik sementara PostgreSQL memungkinkan spesifikasi zona waktu yang lebih fleksibel. Semua fitur SET lainnya adalah ekstensi PostgreSQL.

Muhammad Usama
sumber
2
Saya telah mencoba mengaturnya dan sepertinya tidak berhasil, juga tidak itu hanya mengaturnya untuk sesi aktif. Saya ingin mengubahnya secara permanen untuk semua database dll, saya melakukan ini dengan mudah di phpmyadmin tetapi tampaknya tidak dapat menemukan cara untuk melakukannya untuk postgresql
Blu Towers
yup 'setel zona waktu Ke ..' hanya menyetel zona waktu untuk sesi saat ini dan jika Anda mengubah parameter konfigurasi zona waktu di Postgresql.conf, itu harus mengubah zona waktu untuk semua database.
Muhammad Usama
4
Saya telah mencoba dengan mengubah zona waktu menjadi GMT di postgresql.conf dan tampaknya berfungsi dengan baik.
Muhammad Usama
Lebih standar (SQL spesifikasi compliant) adalah dua kata untuk "ZONA WAKTU": SET TIME ZONE 'UTC';. Lihat dok .
Basil Bourque
103

Pilih timezonedari:

SELECT * FROM pg_timezone_names;

Dan setseperti di bawah ini diberikan contoh:

ALTER DATABASE postgres SET timezone TO 'Europe/Berlin';

Gunakan nama DB Anda sebagai pengganti postgresdalam pernyataan di atas.

Iurii Perevertailo
sumber
4
Anda perlu memulai ulang layanan postgresql setelah ini selesai
Joey Pinto
24
@JoeyPinto tidak benar, itu cukup untuk mengeluarkan SELECT pg_reload_conf();:)
Alphaaa
4
Aku berlari pernyataan dengan nama database saya dan SELECT pg_reload_conf()kembali benar, tetapi now()dan select current_setting('TIMEZONE')terus kembali nilai-nilai untuk 'America / New_York'. Apakah karena saya bukan superuser?
Noumenon
48

Untuk menyelesaikan perubahan zona waktu di Postgres 9.1 Anda harus:

1.- Cari di folder "zona waktu" di /usr/share/postgresql/9.1/ untuk file yang sesuai, dalam kasus saya adalah "America.txt", di dalamnya, cari lokasi terdekat dengan zona Anda dan salin huruf pertama di kolom kiri.

Misalnya: jika Anda berada di "New York" atau "Panama", artinya "EST":

#  - EST: Eastern Standard Time (Australia)
EST    -18000    # Eastern Standard Time (America)
                 #     (America/New_York)
                 #     (America/Panama)

2.- Hapus komentar pada baris "zona waktu" di postgresql.conffile Anda dan letakkan zona waktu Anda seperti yang ditunjukkan:

#intervalstyle = 'postgres'
#timezone = '(defaults to server environment setting)'
timezone = 'EST'
#timezone_abbreviations = 'EST'     # Select the set of available time zone
                                        # abbreviations.  Currently, there are
                                        #   Default
                                        #   Australia

3.- Mulai ulang Postgres

guerrerocarlos
sumber
3
Ini sebenarnya adalah jawaban yang benar karena membuat TZ berubah menjadi default untuk setiap proses di PGSQL, bukan hanya pengguna saat ini.
jfreak53
15
Saya sarankan Anda menghindari kode 3 atau 4 huruf itu sama sekali. Mereka tidak standar atau unik. Alih-alih, gunakan nama zona waktu yang tepat (kota-atau-wilayah SLASH benua). Untuk menggunakan contoh Anda sendiri, Panama menggunakan offset −05:00sepanjang tahun sementara New York menggeser satu jam dengan Daylight Saving Time (DST). Zona waktu lebih dari sekedar offset; zona waktu mencakup seperangkat aturan dan anomali masa lalu, sekarang, dan masa depan seperti DST. Jadi, katakan apa yang Anda maksud: America/Panama, America/New_York, Europe/London, UTC(atau Zulu).
Basil Bourque
3
Sesuai dengan dokumen PostGRE , Anda dapat memeriksa tampilan internal untuk mendapatkan daftar nama zona waktu yang dikenali di database spesifik Anda dengan melakukan SELECT * FROM pg_timezone_namesyang mungkin lebih aman untuk dilakukan, mengingat situs pihak ketiga belum tentu selalu diperbarui (atau kedaluwarsa) sebagai instance database khusus Anda sendiri.
JarangNeedy
Saya tidak memiliki folder itu yang dibagikanpostgresql
SuperUberDuper
Alih-alih memulai ulang PostgreSQL, Anda dapat menjalankan select pg_reload_conf().
ANeves
42

The diterima jawaban oleh Muhammad Usamah benar.

Nama Parameter Konfigurasi

Jawaban itu menunjukkan cara mengatur parameter konfigurasi khusus Postgres dengan yang berikut:

SET timezone TO 'UTC';

… Di mana timezonebukan perintah SQL, itu adalah nama parameter konfigurasi.

Lihat dokumen untuk ini .

Perintah SQL Standar

Atau, Anda dapat menggunakan perintah SQL didefinisikan oleh SQL spesifikasi: SET TIME ZONE. Dalam sintaks ini sepasang kata TIME ZONEmenggantikan "zona waktu" (perintah SQL aktual versus nama parameter), dan tidak ada "TO".

SET TIME ZONE 'UTC';

Baik perintah ini dan perintah di atas memiliki efek yang sama, untuk menyetel nilai hanya untuk sesi saat ini. Untuk membuat perubahan menjadi permanen, lihat jawaban saudara ini .

Lihat dokumen untuk ini .

Nama Zona Waktu

Anda dapat menentukan nama zona waktu yang tepat . Sebagian besar adalah benua / wilayah.

SET TIME ZONE 'Africa/Casablanca';

…atau…

SET TIME ZONE 'America/Montreal';

Hindari singkatan 3 atau 4 huruf seperti ESTatau ISTkarena tidak terstandardisasi atau tidak unik. Lihat Wikipedia untuk daftar nama zona waktu .

Dapatkan zona saat ini

Untuk melihat zona waktu saat ini untuk sebuah sesi, coba salah satu pernyataan berikut. Secara teknis kami memanggil SHOWperintah untuk menampilkan parameter run-time.

SHOW timezone ;

…atau…

SHOW time zone ;

AS / Pasifik

Basil Bourque
sumber
4
poin bonus karena menjadi satu-satunya jawaban untuk memberikan SHOWbagian
Ariel Allon
Diterima, Ariel Allon - dan, untuk orang berikutnya yang ingin memilih zona waktu menjadi variabel ...SELECT current_setting('TIMEZONE')
Mata air
10

Selain jawaban sebelumnya, jika Anda menggunakan alat pgAdmin III, Anda dapat mengatur zona waktu sebagai berikut:

  1. Buka konfigurasi Postgres melalui Alat> Konfigurasi Server> postgresql.conf
  2. Cari zona waktu masuk dan klik dua kali untuk membukanya
  3. Ubah Nilainya
  4. Muat Ulang Server untuk menerapkan perubahan konfigurasi (tombol Putar di atas atau melalui layanan)

Konfigurasi postgres di pgAdmin III

Pascal
sumber
3

Perhatikan banyak klien pihak ketiga memiliki pengaturan zona waktu sendiri yang tumpang tindih dengan server Postgres dan \ atau pengaturan sesi.

Misalnya, jika Anda menggunakan 'IntelliJ IDEA 2017.3' (atau DataGrips), Anda harus menentukan zona waktu sebagai:

'Properti sumber DB' -> tab 'Lanjutan' -> 'Opsi VM': -Duser.timezone = UTC + 06: 00

jika tidak, Anda akan melihat 'UTC' terlepas dari apa pun yang telah Anda atur di tempat lain.

ARA1307
sumber
jadi ini perlu tetap sinkron dengan perubahan waktu musim panas / musim dingin?
Cpt. Senkfuss
1
@ Cpt.Senkfuss, saya yakin sesuatu seperti -Duser.timezone = Australia / Tasmania juga harus berfungsi dan menangani perubahan musim panas \ musim dingin.
ARA1307
Ini adalah trik penyelamat hidup. Saya telah mencoba untuk memahami apa yang salah mungkin selama 3 jam sekarang :) btw, coba nama zona waktu penuh dan berhasil. bagi saya itu -Duser.timezone = Eropa / Istanbul
Olgun Kaya
0

Mungkin tidak terkait dengan pertanyaan, tetapi saya perlu menggunakan CST, mengatur zona waktu sistem ke tz yang diinginkan (Amerika / ...) dan kemudian di postgresql conf atur nilai zona waktu ke 'localtime' dan itu berfungsi sebagai pesona , current_time mencetak waktu yang tepat (Postgresql 9.5 di Ubuntu 16)

MGrillo
sumber