เขตเวลาเริ่มต้น postgres


102

ฉันติดตั้งPostgreSQL 9แล้วและเวลาที่แสดงช้ากว่าเวลาเซิร์ฟเวอร์ 1 ชั่วโมง

การSelect NOW()แสดง:2011-07-12 11:51:50.453842+00

วันที่เซิร์ฟเวอร์แสดง: Tue Jul 12 12:51:40 BST 2011

ช้ากว่า 1 ชั่วโมง แต่เขตเวลาที่แสดงphppgadminคือ:TimeZone Etc/GMT0

ฉันได้ลองเข้าสู่การpostgresql.confตั้งค่าและ

เขตเวลา = GMT

จากนั้นทำการรีสตาร์ท แต่ไม่มีการเปลี่ยนแปลง

ความคิดใดที่ฉันคิดว่ามันจะใช้แค่เขตเวลาเซิร์ฟเวอร์ แต่ไม่ชัด?!

วิธีแก้ปัญหา!: ฉันตั้งค่าไว้GMTก่อนหน้านี้และช้ากว่าหนึ่งชั่วโมง Europe/Londonหลังจากค้นหารอบปรากฎว่าฉันต้องการที่จะตั้งค่าให้ สิ่งนี้คำนึงถึง +1 ชั่วโมงในช่วงฤดูร้อนของอังกฤษ GMT ไม่ได้!


ก่อนที่คุณจะทำการเปลี่ยนแปลงใด ๆ คุณควรตรวจสอบค่าเขตเวลาปัจจุบันเสมอ เคล็ดลับที่นี่: stackoverflow.com/a/28218103/625840
Hartley Brody

คำตอบ:


118

เขตเวลาเป็นพารามิเตอร์ของเซสชัน ดังนั้นคุณสามารถเปลี่ยนเขตเวลาสำหรับเซสชันปัจจุบันได้

ดูเอกสาร

set timezone TO 'GMT';

หรือปฏิบัติตามมาตรฐาน SQL อย่างใกล้ชิดมากขึ้นให้ใช้SET TIME ZONEคำสั่ง สังเกตคำสองคำสำหรับ "TIME ZONE" โดยที่โค้ดด้านบนใช้คำเดียวว่า "timezone"

SET TIME ZONE 'UTC';

เอกสารอธิบายความแตกต่าง:

SET TIME ZONE ขยายไวยากรณ์ที่กำหนดไว้ในมาตรฐาน SQL มาตรฐานอนุญาตให้ใช้เฉพาะการชดเชยโซนเวลาที่เป็นตัวเลขในขณะที่ PostgreSQL อนุญาตให้มีข้อกำหนดเขตเวลาที่ยืดหยุ่นมากขึ้น คุณสมบัติอื่น ๆ ของ SET คือส่วนขยาย PostgreSQL


2
ฉันได้ลองตั้งค่าแล้วและดูเหมือนจะไม่ได้ผล แต่ก็ไม่ได้ตั้งค่าสำหรับเซสชันที่ใช้งานอยู่เท่านั้น ฉันต้องการเปลี่ยนถาวรสำหรับฐานข้อมูลทั้งหมด ect ฉันทำได้อย่างง่ายดายใน phpmyadmin แต่ดูเหมือนจะหาวิธีทำ postgresql ไม่ได้
Blu Towers

yup 'set timezone To .. ' ตั้งค่าเขตเวลาสำหรับเซสชันปัจจุบันเท่านั้นและหากคุณเปลี่ยนพารามิเตอร์การกำหนดค่าเขตเวลาใน Postgresql.conf ควรเปลี่ยนเขตเวลาสำหรับฐานข้อมูลทั้งหมด
มูฮัมหมัดอุซามะ

5
ฉันได้ลองโดยเปลี่ยนเขตเวลาเป็น GMT ใน postgresql.conf และดูเหมือนว่าจะใช้งานได้ดี
มูฮัมหมัดอุซามะ

มาตรฐานมากขึ้น (SQL ข้อมูลจำเพาะสอดคล้อง) เป็นคำสองคำสำหรับ "TIME SET TIME ZONE 'UTC';ZONE": ดูเอกสาร
Basil Bourque

107

เลือกtimezoneจาก:

SELECT * FROM pg_timezone_names;

และsetดังตัวอย่างด้านล่าง:

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

ใช้ชื่อฐานข้อมูลของคุณแทนpostgresข้อความข้างต้น


5
คุณต้องเริ่มบริการ postgresql ใหม่หลังจากเสร็จสิ้น
Joey Pinto

25
@JoeyPinto ไม่จริงก็พอที่จะออกSELECT pg_reload_conf();:)
Alphaaa

4
ฉันวิ่งคำสั่งที่มีชื่อในฐานข้อมูลของฉันและSELECT pg_reload_conf()กลับมาจริง แต่now()และselect current_setting('TIMEZONE')ยังคงค่าตอบแทนสำหรับ 'อเมริกา / New_York' เป็นเพราะฉันไม่ใช่ superuser หรือเปล่า?
Noumenon

ขอบคุณสำหรับข้อเสนอแนะฉันลองใช้ SELECT pg_reload_conf () และมันก็คืนค่าจริงเช่นกัน แต่มันไม่ได้แสดงเขตเวลาที่อัปเดตหลังจากรีสตาร์ทบริการของ postgres มันสะท้อนให้เห็นเขตเวลาใหม่
Prem popatia

@Prempopatia ฉันเชื่อว่าคุณกำลังเชื่อมต่อกับฐานข้อมูลที่แตกต่างจากที่คุณแก้ไข
Alex Rizvi

49

หากต้องการบรรลุการเปลี่ยนแปลงเขตเวลาใน Postgres 9.1 คุณต้อง:

1.-ค้นหาในโฟลเดอร์ "เขตเวลา" ใน /usr/share/postgresql/9.1/ สำหรับไฟล์ appropiate ในกรณีของฉันจะเป็น "America.txt" ในนั้นค้นหาตำแหน่งที่ใกล้ที่สุดกับโซนของคุณและคัดลอก อักษรตัวแรกในคอลัมน์ด้านซ้าย

ตัวอย่างเช่นหากคุณอยู่ใน "นิวยอร์ก" หรือ "ปานามา" จะเป็น "EST":

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

2.-ยกเลิกการใส่เครื่องหมาย "เขตเวลา" ในpostgresql.confไฟล์ของคุณและใส่เขตเวลาของคุณตามที่แสดง:

#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


3
นี่เป็นคำตอบที่ถูกต้องเนื่องจากทำให้ TZ เปลี่ยนเป็นค่าเริ่มต้นสำหรับทุกกระบวนการใน PGSQL ไม่ใช่เฉพาะผู้ใช้ปัจจุบัน
jfreak53

15
ฉันขอแนะนำให้คุณหลีกเลี่ยงรหัสตัวอักษร 3 หรือ 4 ตัวทั้งหมด พวกเขาไม่ได้มาตรฐานหรือไม่ซ้ำกัน ใช้ชื่อเขตเวลาที่เหมาะสมแทน(ทวีป SLASH เมืองหรือภูมิภาค) ในการใช้ตัวอย่างของคุณเองปานามาใช้การชดเชย−05:00ตลอดทั้งปีในขณะที่นิวยอร์กเปลี่ยนชั่วโมงด้วยเวลาออมแสง (DST) เขตเวลาเป็นมากกว่าการชดเชย เขตเวลาประกอบด้วยชุดกฎและความผิดปกติในอดีตปัจจุบันและอนาคตเช่น DST ดังนั้นพูดในสิ่งที่คุณหมายถึง: America/Panama, America/New_York, Europe/London, UTC(หรือZulu)
Basil Bourque

3
ตามเอกสาร PostGREคุณสามารถตรวจสอบมุมมองภายในเพื่อรับรายชื่อเขตเวลาที่เป็นที่รู้จักในฐานข้อมูลเฉพาะของคุณโดยการทำSELECT * FROM pg_timezone_namesสิ่งที่ปลอดภัยกว่าที่จะทำเนื่องจากเว็บไซต์ของบุคคลที่สามไม่จำเป็นต้องเป็นข้อมูลล่าสุด (หรือล้าสมัย) เป็นอินสแตนซ์ฐานข้อมูลเฉพาะของคุณเอง
ไม่ค่อย 'Where's Monica' Needy

ฉันไม่มีโฟลเดอร์นั้นในการแชร์postgresql
SuperUberDuper

แทนการรีสตาร์ท PostgreSQL select pg_reload_conf()คุณสามารถเรียกใช้
ANeves คิดว่า SE เป็นคนชั่ว

43

คำตอบที่ได้รับการยอมรับโดยมูฮัมหมัดอุซามะห์ถูกต้อง

ชื่อพารามิเตอร์การกำหนดค่า

คำตอบดังกล่าวแสดงวิธีตั้งค่าพารามิเตอร์คอนฟิกูเรชันเฉพาะ Postgres ดังต่อไปนี้:

SET timezone TO 'UTC';

…โดยที่timezoneไม่ใช่คำสั่ง SQL แต่เป็นชื่อของพารามิเตอร์คอนฟิกูเรชัน

ดูเอกสารสำหรับการนี้

คำสั่ง SQL มาตรฐาน

หรือคุณสามารถใช้คำสั่ง SQL ที่กำหนดโดยสเปคของ SET TIME ZONESQL: ในไวยากรณ์นี้คำคู่หนึ่งTIME ZONEแทนที่ "เขตเวลา" (คำสั่ง SQL จริงเทียบกับชื่อพารามิเตอร์) และไม่มี "TO"

SET TIME ZONE 'UTC';

ทั้งคำสั่งนี้และคำสั่งข้างต้นมีผลเหมือนกันเพื่อตั้งค่าสำหรับเซสชันปัจจุบันเท่านั้น หากต้องการทำการเปลี่ยนแปลงอย่างถาวรโปรดดูคำตอบของพี่น้องคู่นี้

ดูเอกสารสำหรับการนี้

ชื่อโซนเวลา

คุณสามารถระบุชื่อเขตเวลาที่เหมาะสมได้ ส่วนใหญ่เป็นทวีป / ภูมิภาค

SET TIME ZONE 'Africa/Casablanca';

…หรือ…

SET TIME ZONE 'America/Montreal';

หลีกเลี่ยงตัวย่อ3 หรือ 4 ตัวอักษรเช่นESTหรือISTเนื่องจากไม่มีมาตรฐานหรือไม่ซ้ำกัน ดูวิกิพีเดียรายชื่อโซนเวลา

รับโซนปัจจุบัน

หากต้องการดูเขตเวลาปัจจุบันของเซสชันให้ลองใช้ข้อความต่อไปนี้ ในทางเทคนิคเรากำลังเรียกใช้SHOWคำสั่งเพื่อแสดงพารามิเตอร์รันไทม์

SHOW timezone ;

…หรือ…

SHOW time zone ;

สหรัฐฯ / แปซิฟิก


4
คะแนนโบนัสสำหรับการเป็นคำตอบเดียวที่จะให้SHOWส่วน
Ariel Allon

Roger that, Ariel Allon - และสำหรับผู้ชายคนต่อไปที่ต้องการเลือกเขตเวลานั้นเป็นตัวแปร ...SELECT current_setting('TIMEZONE')
Wellspring

10

นอกเหนือจากคำตอบก่อนหน้านี้หากคุณใช้เครื่องมือpgAdmin IIIคุณสามารถตั้งค่าเขตเวลาได้ดังนี้:

  1. เปิด Postgres config ผ่านTools> Server Configuration> postgresql.conf
  2. มองหาเขตเวลาเข้าและดับเบิลคลิกเพื่อเปิด
  3. เปลี่ยนค่า
  4. โหลดเซิร์ฟเวอร์ใหม่เพื่อใช้การเปลี่ยนแปลงการกำหนดค่า (ปุ่มเล่นที่ด้านบนหรือผ่านบริการ)

Postgres config ใน pgAdmin III


3

โปรดทราบว่าไคลเอนต์ของบุคคลที่สามจำนวนมากมีการตั้งค่าเขตเวลาของตัวเองซ้อนทับเซิร์ฟเวอร์ Postgres และ \ หรือการตั้งค่าเซสชัน

เช่นหากคุณใช้ 'IntelliJ IDEA 2017.3' (หรือ DataGrips) คุณควรกำหนดเขตเวลาเป็น:

'คุณสมบัติแหล่ง DB' -> แท็บ 'ขั้นสูง' -> 'ตัวเลือก VM': -Duser.timezone = UTC + 06: 00

มิฉะนั้นคุณจะเห็น 'UTC' แม้ว่าคุณจะตั้งค่าไว้ที่ใดก็ตาม


ดังนั้นสิ่งนี้จะต้องสอดคล้องกับการเปลี่ยนแปลงเวลาฤดูร้อน / ฤดูหนาว?
Cpt. Senkfuss

1
@ Cpt.Senkfuss ฉันเชื่อว่าบางอย่างเช่น -Duser.timezone = ออสเตรเลีย / แทสเมเนียควรทำงานและดูแลการเปลี่ยนแปลงของฤดูร้อนและฤดูหนาว
ARA1307

นี่คือเคล็ดลับช่วยชีวิต ฉันพยายามที่จะไม่เข้าใจว่ามีอะไรผิดปกติอาจเป็นเวลา 3 ชั่วโมงในตอนนี้ :) btw ลองใช้ชื่อเขตเวลาแบบเต็มแล้วใช้งานได้ สำหรับฉันมันคือ -Duser.timezone = Europe / Istanbul
Olgun Kaya

1

อาจไม่เกี่ยวข้องกับคำถาม แต่ฉันจำเป็นต้องใช้ CST ตั้งเขตเวลาของระบบเป็น tz ที่ต้องการ (America / ... ) จากนั้นใน postgresql conf ตั้งค่าของเขตเวลาเป็น 'localtime' และมันก็ทำงานเป็นเสน่ห์ , current_time พิมพ์เวลาที่เหมาะสม (Postgresql 9.5 บน Ubuntu 16)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.