múi giờ mặc định của postgres


99

Tôi đã cài đặt PostgreSQL 9và thời gian nó hiển thị chậm hơn thời gian máy chủ 1 giờ.

Đang chạy Select NOW()chương trình:2011-07-12 11:51:50.453842+00

Ngày máy chủ hiển thị: Tue Jul 12 12:51:40 BST 2011

Còn chậm hơn 1 giờ nhưng múi giờ được hiển thị phppgadminlà:TimeZone Etc/GMT0

Tôi đã thử đi vào postgresql.confvà cài đặt

múi giờ = GMT

sau đó chạy khởi động lại nhưng không có gì thay đổi.

Bất kỳ ý tưởng nào tôi nghĩ rằng nó sẽ chỉ sử dụng múi giờ máy chủ nhưng rõ ràng là không ?!

GIẢI PHÁP !: Tôi đã đặt GMTtrước đó và đã chậm hơn một giờ. sau khi tìm kiếm xung quanh hóa ra tôi cần đặt nó thành Europe/London. Điều này có tính đến +1 giờ theo giờ mùa hè của Anh, GMT thì không!

Câu trả lời:


113

Múi giờ là một tham số phiên. Vì vậy, bạn có thể thay đổi múi giờ cho phiên hiện tại.

Xem tài liệu .

set timezone TO 'GMT';

Hoặc, theo sát tiêu chuẩn SQL hơn, hãy sử dụng SET TIME ZONElệnh. Lưu ý hai từ cho "TIME ZONE" trong đó mã ở trên sử dụng một từ duy nhất "múi giờ".

SET TIME ZONE 'UTC';

Tài liệu giải thích sự khác biệt:

SET TIME ZONE mở rộng cú pháp được xác định trong tiêu chuẩn SQL. Tiêu chuẩn chỉ cho phép chênh lệch múi giờ số trong khi PostgreSQL cho phép các đặc tả múi giờ linh hoạt hơn. Tất cả các tính năng SET khác là phần mở rộng PostgreSQL.


2
Tôi đã thử thiết lập điều đó và nó dường như không hoạt động, cũng không phải chỉ đặt nó cho phiên hoạt động. Tôi muốn thay đổi nó vĩnh viễn cho tất cả các cơ sở dữ liệu vv, tôi đã làm điều này một cách dễ dàng trong phpmyadmin nhưng dường như không thể tìm thấy một cách để làm điều đó cho postgresql
Blu Towers

yup 'set timezone To ..' chỉ đặt múi giờ cho phiên hiện tại và nếu bạn thay đổi thông số cấu hình múi giờ trong Postgresql.conf, nó sẽ thay đổi múi giờ cho tất cả cơ sở dữ liệu.
Muhammad Usama,

4
Tôi đã thử bằng cách thay đổi múi giờ thành GMT trong postgresql.conf và có vẻ như nó đang hoạt động tốt.
Muhammad Usama

Chuẩn hơn (SQL đặc tả phù hợp) là hai chữ cho "TIME ZONE": SET TIME ZONE 'UTC';. Xem tài liệu .
Basil Bourque

102

Chọn một timezonetừ:

SELECT * FROM pg_timezone_names;

setnhư ví dụ dưới đây:

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

Sử dụng tên DB của bạn thay cho postgrescâu lệnh trên.


4
Bạn cần phải khởi động lại dịch vụ postgresql sau khi hoàn tất việc này
Joey Pinto

24
@JoeyPinto không đúng, nó đủ để phát hành SELECT pg_reload_conf();:)
Alphaaa 21/10/16

4
Tôi chạy báo cáo kết quả với tên cơ sở dữ liệu của tôi và SELECT pg_reload_conf()trở thành sự thật, nhưng now()select current_setting('TIMEZONE')tiếp tục quay trở lại giá trị cho 'America / New_York'. Có phải vì tôi không phải là siêu người dùng?
Noumenon

48

Để thay đổi múi giờ trong Postgres 9.1, bạn phải:

1.- Tìm kiếm trong thư mục "múi giờ" của bạn trong /usr/share/postgresql/9.1/ để biết tệp phê duyệt, trong trường hợp của tôi sẽ là "America.txt", trong đó, tìm kiếm vị trí gần nhất với khu vực của bạn và sao chép các chữ cái đầu tiên ở cột bên trái.

Ví dụ: nếu bạn ở "New York" hoặc "Panama", nó sẽ là "EST":

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

2.- Bỏ ghi chú dòng "múi giờ" trong postgresql.conftệp của bạn và đặt múi giờ của bạn như được hiển thị:

#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.- Khởi động lại Postgres


3
Đây thực sự là câu trả lời chính xác vì nó làm cho TZ thay đổi mặc định cho mọi quy trình trong PGSQL, không chỉ người dùng hiện tại.
jfreak53

15
Tôi khuyên bạn nên tránh hoàn toàn những mã 3 hoặc 4 chữ cái đó . Chúng không được tiêu chuẩn hóa và cũng không phải là duy nhất. Thay vào đó, hãy sử dụng tên múi giờ thích hợp (thành phố hoặc khu vực SLASH của lục địa). Để sử dụng ví dụ của riêng bạn, Panama sử dụng mức bù −05:00quanh năm trong khi New York thay đổi một giờ với Giờ tiết kiệm ánh sáng ban ngày (DST). Múi giờ không chỉ là một độ lệch; múi giờ bao gồm tập hợp các quy tắc và hiện tượng bất thường trong quá khứ, hiện tại và tương lai, chẳng hạn như DST. Vì vậy, nói những gì bạn có nghĩa là: America/Panama, America/New_York, Europe/London, UTC(hoặc Zulu).
Basil Bourque

3
Theo tài liệu PostGRE , bạn có thể kiểm tra chế độ xem nội bộ để nhận danh sách các tên múi giờ được công nhận trong cơ sở dữ liệu cụ thể của mình bằng cách thực hiện SELECT * FROM pg_timezone_namesđiều này có lẽ an toàn hơn, do các trang web của bên thứ 3 sẽ không nhất thiết phải cập nhật (hoặc lỗi thời) làm phiên bản cơ sở dữ liệu cụ thể của riêng bạn.
Ít khi cần thiết vào

Tôi không có thư mục đó trong phầnpostgresql
SuperUberDuper

Thay vì khởi động lại PostgreSQL, bạn có thể chạy select pg_reload_conf().
ANeves

42

Các câu trả lời được chấp nhận bởi Muhammad Usama là đúng.

Tên thông số cấu hình

Câu trả lời đó cho thấy cách đặt thông số cấu hình dành riêng cho Postgres như sau:

SET timezone TO 'UTC';

… Đâu timezonekhông phải là lệnh SQL, nó là tên của tham số cấu hình.

Xem tài liệu cho điều này .

Lệnh SQL tiêu chuẩn

Ngoài ra, bạn có thể sử dụng lệnh SQL được định nghĩa bởi spec SQL: SET TIME ZONE. Trong cú pháp này, một cặp từ TIME ZONEthay thế "múi giờ" (lệnh SQL thực so với tên tham số) và không có "TO".

SET TIME ZONE 'UTC';

Cả lệnh này và lệnh ở trên đều có cùng tác dụng, chỉ đặt giá trị cho phiên hiện tại. Để thay đổi vĩnh viễn, hãy xem câu trả lời của anh chị em này .

Xem tài liệu cho điều này .

Tên múi giờ

Bạn có thể chỉ định một tên múi giờ thích hợp . Hầu hết trong số này là lục địa / khu vực.

SET TIME ZONE 'Africa/Casablanca';

…hoặc là…

SET TIME ZONE 'America/Montreal';

Tránh các chữ viết tắt 3 hoặc 4 chữ cái, chẳng hạn như ESThoặc ISTvì chúng không được tiêu chuẩn hóa hoặc duy nhất. Xem Wikipedia để biết danh sách tên múi giờ .

Nhận khu vực hiện tại

Để xem múi giờ hiện tại cho một phiên, hãy thử một trong các câu lệnh sau. Về mặt kỹ thuật, chúng tôi đang gọi SHOWlệnh để hiển thị tham số thời gian chạy.

SHOW timezone ;

…hoặc là…

SHOW time zone ;

Hoa Kỳ / Thái Bình Dương


4
Điểm thưởng cho câu trả lời là chỉ để cung cấp các SHOWphần
Ariel Allon

Rõ ràng điều đó, Ariel Allon - và cho chàng trai tiếp theo muốn chọn múi giờ đó thành một biến ...SELECT current_setting('TIMEZONE')
Wellspring

10

Ngoài các câu trả lời trước, nếu bạn sử dụng công cụ pgAdmin III, bạn có thể đặt múi giờ như sau:

  1. Mở cấu hình Postgres qua Công cụ> Cấu hình máy chủ> postgresql.conf
  2. Tìm múi giờ nhập cảnh và nhấp đúp để mở
  3. Thay đổi giá trị
  4. Tải lại Máy chủ để áp dụng các thay đổi cấu hình (nút Phát trên đầu hoặc thông qua các dịch vụ)

Cấu hình Postgres trong pgAdmin III


3

Lưu ý rằng nhiều ứng dụng khách của bên thứ ba có cài đặt múi giờ riêng chồng chéo lên bất kỳ máy chủ Postgres nào và cài đặt \ hoặc phiên.

Ví dụ: nếu bạn đang sử dụng 'IntelliJ IDEA 2017.3' (hoặc DataGrips), bạn nên xác định múi giờ là:

'Thuộc tính nguồn DB' -> tab 'Nâng cao' -> 'Tùy chọn VM': -Duser.timezone = UTC + 06: 00

nếu không, bạn sẽ thấy 'UTC' bất chấp bất kỳ điều gì bạn đã đặt ở bất kỳ nơi nào khác.


vì vậy điều này cần được giữ đồng bộ với sự thay đổi thời gian mùa hè / mùa đông?
Cpt. Senkfuss

1
@ Cpt.Senkfuss, tôi tin rằng những thứ như -Duser.timezone = Australia / Tasmania cũng nên hoạt động và quan tâm đến những thay đổi trong mùa hè \ mùa đông.
ARA1307

Đây là một mẹo tiết kiệm cuộc sống. Tôi đã cố gắng để không chịu được những gì sai có thể xảy ra trong 3 giờ cho đến nay :) btw, đã thử tên múi giờ đầy đủ và nó hoạt động. đối với tôi đó là -Duser.timezone = Europe / Istanbul
Olgun Kaya

0

Có thể không liên quan đến câu hỏi, nhưng tôi cần sử dụng CST, đặt múi giờ hệ thống thành tz mong muốn (Châu Mỹ / ...) và sau đó trong postgresql conf đặt giá trị của múi giờ thành 'localtime' và nó hoạt động như một sự quyến rũ , current_time in đúng thời điểm (Postgresql 9.5 trên Ubuntu 16)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.