Postgresql

為什麼我會看到 PgAdmin 中顯示的時區偏移量,以獲取帶有時區的時間戳

  • March 9, 2022

我正在使用 PgAdmin 4 v6,對於一些數據類型為 的時間戳數據timestamp with time zone,我在 PgAdmin 中看到它是這樣的:

2022-03-06 16:11:33+04

為什麼+04正在顯示?


我查看了以下 postgres 指南:

https://www.postgresql.org/docs/9.2/datatype-datetime.html#:~:text=PostgreSQL%20assumes%20your%20local%20time,being%20displayed%20to%20the%20client .

它聲明如下:

所有可辨識時區的日期和時間都以 UTC 格式在內部儲存。在顯示給客戶端之前,它們會轉換為 TimeZone 配置參數指定的區域中的本地時間。

此處的參考說明了有關 Postgres 中 TimeZone 配置的以下內容:

TimeZone (string)設置顯示和解釋時間戳的時區。內置預設值是 GMT,但通常在 postgresql.conf 中被覆蓋;initdb 將在那里安裝與其係統環境相對應的設置。

這表明以某種方式從數據庫主機系統派生的時區被添加到 postgresql.conf 中。

假設我在 PgAdmin 中看到偏移量的原因是 PgAdmin 正在顯示儲存值的轉換版本,該版本基於儲存在 postgresql.conf 中的數據庫主機系統的時區資訊。誰能確認這是否是 PgAdmin 在顯示具有數據類型的數據時所做的事情timestamp with timezone

我在都柏林 - 目前在 UTC/GMT。

我做了以下事情:

CREATE TABLE t 
(
 x TIMESTAMPTZ NOT NULL
);

然後

INSERT INTO t VALUES (NOW());

然後在 pgAdmin 中,我SELECT * FROM t和我看到的值是

x
timestamp with timezone
2022-03-09 05:15:02.899933+00

注意時區:2022-03-09 05:15:02.899933 +00- 因為我在 UTC/GMT。

美好的。我檢查了我的postgresql.conf,我有timezone = 'Europe/Dublin'

為了仔細檢查,我查看了命令行:

postgres=# SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
    name      | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Dublin | GMT    | 00:00:00   | t
(1 row)

所以,腰帶和背帶:

postgres=# SELECT name, setting, unit, short_desc FROM pg_settings WHERE setting  LIKE '%ublin%';
  name   |    setting    | unit |                           short_desc
----------+---------------+------+-----------------------------------------------------------------
TimeZone | Europe/Dublin |      | Sets the time zone for displaying and interpreting time stamps.
(1 row)

注意short_desc欄位:

Sets the time zone for displaying and interpreting time stamps.

現在,我編輯我postgresql.conf的並將時區更改為America/Los_Angeles並重新啟動我的伺服器!

現在,如果我這樣做SELECT * FROM t;,它會給我:

2022-03-08 21:15:02.899933-08

比較一下2022-03-09 05:15:02.899933+00- 它們是相同的時間- 只是顯示不同 -完全取決於我的postgresql.conf設置!

大概這是為了讓顯示的時間對那些查看它們的人來說是有意義的。人們不會認為他們在半夜有約會。如果不習慣它們,可以很容易地跳過顯示的日期時間/時間戳的時區部分。

我可以想到一個例子,說明始終以 UTC/Zulu顯示可能是個好主意,那就是在民用航空中,始終以 Zulu 給出所有時間(您會經常看到 YYYY-MM-DD HH: MM:SSZ寫的)。

回答:

是的,它是決定時間顯示給你的timezone設置!價值是不可變的!postgresql.conf``TIMESTAMPTZ

你說:

我假設我在 PgAdmin 中看到偏移量的原因是 PgAdmin 正在顯示儲存值的轉換版本,該版本基於儲存在 postgresql.conf 中的數據庫主機系統的時區資訊。誰能確認這是否是 PgAdmin 在顯示具有時區數據類型時間戳的數據時所做的事情?

當我在這台機器上安裝 Windows 時,我選擇了 PC 的時區,Dublin, Edinburgh, Lisbon, London當我安裝 PostgreSQL 時,時區postgresql.conf設置為Europe/London- 我將其重置為Europe/Dublin. PostgreSQL 顯然會根據您的系統設置做出它認為的最佳猜測。但是,正如您從上面看到的,很容易改變這一點。

引用自:https://dba.stackexchange.com/questions/308459