postgres varsayılan saat dilimi


99

Yükledim PostgreSQL 9ve gösterdiği saat sunucu saatinin 1 saat gerisinde.

Koşu Select NOW()şovları:2011-07-12 11:51:50.453842+00

Sunucu tarihi şunları gösterir: Tue Jul 12 12:51:40 BST 2011

1 saat geridedir ancak gösterilen saat dilimi phppgadmin:TimeZone Etc/GMT0

postgresql.confVe ayarına girmeyi denedim

saat dilimi = GMT

daha sonra yeniden başlatma işlemi yapılır ancak değişiklik yapılmaz.

Sunucunun zaman dilimini kullanacağını düşündüğüm, ancak belli ki kullanmadığını düşündüğüm herhangi bir fikir ?!

ÇÖZÜM !: GMTÖnceden yola çıktım ve bir saat gerideydi. etrafta arama yaptıktan sonra bunu ayarlamam gerektiği ortaya çıktı Europe/London. Bu, İngiliz yaz saatindeki +1 saatini hesaba katar, GMT bunu yapmaz!


Herhangi bir değişiklik yapmadan önce, mevcut saat dilimi değerini kontrol etmek her zaman iyidir. İpuçları burada: stackoverflow.com/a/28218103/625840
Hartley Brody

Yanıtlar:


115

Saat dilimi bir oturum parametresidir. Böylece, mevcut oturumun saat dilimini değiştirebilirsiniz.

Belgeye bakın .

set timezone TO 'GMT';

Veya SQL standardını daha yakından takip ederek SET TIME ZONEkomutu kullanın. Yukarıdaki kodun tek bir kelime "saat dilimi" kullandığı "TIME ZONE" için iki kelimeye dikkat edin.

SET TIME ZONE 'UTC';

Doküman farkı şöyle açıklıyor:

SET TIME ZONE, SQL standardında tanımlanan sözdizimini genişletir. Standart, yalnızca sayısal saat dilimi farklarına izin verirken, PostgreSQL daha esnek zaman dilimi özelliklerine izin verir. Diğer tüm SET özellikleri PostgreSQL uzantılarıdır.


2
Bunu ayarlamayı denedim ve işe yaramadı, bu da onu sadece aktif oturum için ayarlamıyor. Tüm veritabanları için kalıcı olarak değiştirmek istiyorum, vb, bunu phpmyadmin'de kolayca yaptım ama postgresql için yapmanın bir yolunu bulamıyorum
Blu Towers

yup 'set timezone To ..' yalnızca geçerli oturum için saat dilimini ayarlar ve Postgresql.conf'daki saat dilimi yapılandırma parametresini değiştirirseniz, tüm veritabanları için saat dilimini değiştirmelidir.
Muhammed Usama

5
Postgresql.conf'ta saat dilimini GMT olarak değiştirmeyi denedim ve iyi çalışıyor gibi görünüyor.
Muhammed Usama

(SQL'ın Spec uyumlu) Daha standart "TIME ZONE" için iki kelime: SET TIME ZONE 'UTC';. Belgeye bakın .
Basil Bourque

105

Aşağıdakilerden birini seçin timezone:

SELECT * FROM pg_timezone_names;

Ve setaşağıda verilen örnek gibi:

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

postgresYukarıdaki ifadenin yerine DB adınızı kullanın .


5
Bunu yaptıktan sonra postgresql hizmetini yeniden başlatmanız gerekiyor
Joey Pinto

25
@JoeyPinto doğru değil, yayınlamak yeterli SELECT pg_reload_conf();:)
Alphaaa

4
Benim veritabanı adı ile açıklama koştu ve SELECT pg_reload_conf()gerçek döndü ama now()ve select current_setting('TIMEZONE')'Amerika / New_York' değerlerini dönüş devam ediyor. Süper kullanıcı olmadığım için mi?
Noumenon

@JoeyPinto öneri için teşekkürler, SELECT pg_reload_conf () ile denedim ve aynı zamanda true döndü, ancak güncellenmiş saat dilimini göstermedi, postgres hizmetini yeniden başlattıktan sonra, yeni saat dilimini yansıtıyordu.
Prem popatia

49

Postgres 9.1'deki saat dilimi değişikliğini tamamlamak için şunları yapmalısınız:

1.- Uygun dosya için /usr/share/postgresql/9.1/ içindeki "saat dilimleri" klasörünüzde arama yapın, benim durumumda "America.txt" olacaktır, içinde bölgenize en yakın konumu arayın ve sol sütundaki ilk harfler.

Örneğin: "New York" veya "Panama" da iseniz, "EST" olacaktır:

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

2.-postgresql.conf Dosyanızdaki "saat dilimi" satırının açıklamasını kaldırın ve saat diliminizi gösterildiği gibi ayarlayın:

#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.- Postgres'i yeniden başlatın


3
Bu aslında doğru cevaptır çünkü TZ'yi sadece mevcut kullanıcı için değil, PGSQL'deki her işlem için varsayılan olarak değiştirir.
jfreak53

15
Bu 3 veya 4 harfli kodlardan tamamen kaçınmanızı öneririm . Ne standartlaştırılmış ne de benzersizdirler. Bunun yerine, uygun saat dilimi adlarını kullanın (kıta SLASH şehri veya bölgesi). Kendi örneğinizi kullanmak için, Panama −05:00yıl boyunca ofset kullanırken New York, Yaz Saati Uygulaması (DST) ile bir saat kaydırır. Bir saat dilimi bir farktan daha fazlasıdır; bir saat dilimi, DST gibi geçmiş, şimdiki ve gelecekteki kurallar ve anormallikler kümesini içerir. Yani, demek istediğini ki: America/Panama,America/New_York , Europe/London, UTC(veya Zulu).
Basil Bourque

3
Gereğince Postgre docs , sen yaparak belirli veritabanında tanınan zaman dilimi adlarının bir listesini almak için bir iç görünüm kontrol edebilirsiniz SELECT * FROM pg_timezone_namesyapmak daha güvenli olan verilen 3. taraf siteleri mutlaka yukarı güncel olarak olmayacak (veya güncelliğini yitirmiş) kendi özel veritabanı örneğiniz olarak.
SeldomNeedy

Paylaşımda bu klasör yokpostgresql
SuperUberDuper

PostgreSQL'i yeniden başlatmak yerine çalıştırabilirsiniz select pg_reload_conf().
ANeves, SE'nin kötü olduğunu düşünüyor

43

Kabul cevap tarafından Muhammed Üsame doğrudur.

Yapılandırma Parametre Adı

Bu yanıt, Postgres'e özgü bir yapılandırma parametresinin aşağıdakilerle nasıl ayarlanacağını gösterir:

SET timezone TO 'UTC';

… Burada timezonebir SQL komutu yoksa, konfigürasyon parametresinin adıdır.

Bunun için dokümana bakın .

Standart SQL Komutu

Alternatif olarak, SQL spec tarafından tanımlanan SQL komutunu kullanabilirsiniz: SET TIME ZONE. Bu sözdiziminde bir çift kelime TIME ZONE"zaman dilimi" nin yerini alır (gerçek SQL komutuna karşı parametre adı) ve "KİM" yoktur.

SET TIME ZONE 'UTC';

Hem bu komut hem de yukarıdaki komut, yalnızca geçerli oturum için değer ayarlamak üzere aynı etkiye sahiptir. Değişikliği kalıcı hale getirmek için bu kardeş cevaba bakın .

Bunun için dokümana bakın .

Saat Dilimi Adı

Uygun bir saat dilimi adı belirtebilirsiniz . Bunların çoğu kıta / bölgedir.

SET TIME ZONE 'Africa/Casablanca';

…veya…

SET TIME ZONE 'America/Montreal';

3 ya da 4 harfli kaçının gibi kısaltmalar ESTya ISTda ne standardize ne de benzersiz gibidir. Wikipedia'ya bakınSaat dilimi adlarının listesi .

Mevcut bölgeyi al

Bir oturum için geçerli saat dilimini görmek için aşağıdaki ifadelerden birini deneyin. Teknik olarak, SHOWbir çalışma zamanı parametresini görüntülemek için komutu çağırıyoruz .

SHOW timezone ;

…veya…

SHOW time zone ;

ABD / Pasifik


4
sağlamak için tek bir cevap olduğu için bonus puan SHOWparçasını
Ariel Allon

Anlaşıldı, Ariel Allon - ve bu saat dilimini bir değişkene seçmek isteyen bir sonraki adam için ...SELECT current_setting('TIMEZONE')
Wellspring

10

Önceki cevaplara ek olarak, pgAdmin III aracını kullanırsanız , saat dilimini aşağıdaki gibi ayarlayabilirsiniz:

  1. Araçlar> Sunucu Yapılandırması> postgresql.conf aracılığıyla Postgres yapılandırmasını açın
  2. Giriş saat dilimini bulun ve açmak için çift tıklayın
  3. Değeri Değiştirin
  4. Yapılandırma değişikliklerini uygulamak için Sunucuyu Yeniden Yükleyin (Üstte veya hizmetler aracılığıyla Oynat düğmesi)

PgAdmin III'te Postgres yapılandırması


3

Birçok üçüncü taraf istemcinin, herhangi bir Postgres sunucusu ve \ veya oturum ayarıyla çakışan kendi saat dilimi ayarlarına sahip olduğunu unutmayın.

Örneğin, 'IntelliJ IDEA 2017.3' (veya DataGrips) kullanıyorsanız, saat dilimini şu şekilde tanımlamalısınız:

'DB kaynak özellikleri' -> 'Gelişmiş' sekmesi -> 'VM Seçenekleri': -Duser.timezone = UTC + 06: 00

aksi halde başka herhangi bir yerde ayarladığınız her şeye rağmen 'UTC' göreceksiniz.


yani bunun yaz / kış saati değişiklikleriyle uyumlu tutulması gerekiyor?
Cpt. Senkfuss

1
@ Cpt.Senkfuss, -Duser.timezone = Avustralya / Tazmanya gibi bir şeyin de çalışması ve yaz / kış değişikliklerine dikkat etmesi gerektiğine inanıyorum.
ARA1307

Bu hayat kurtarıcı bir numaradır. 3 saattir sorunun ne olduğunu anlamaya çalışıyorum :) btw, tam saat dilimi adını denedim ve işe yarıyor. benim için -Duser.timezone = Avrupa / İstanbul
Olgun Kaya

0

Belki soruyla ilgili olmayabilirdi, ancak CST'yi kullanmam, sistem saat dilimini istenen tz'ye (Amerika / ...) ayarlamam ve sonra postgresql conf'de saat diliminin değerini 'localtime' olarak ayarlamam gerekiyordu ve bu harika çalıştı , current_time doğru zamanda yazdırma (Ubuntu 16'da Postgresql 9.5)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.