2017-05-26 149 views
-1

我想在幾個表中的UTC時間戳「創建」字段。Postgres UTC時間戳?

ts TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),給我的本地時間與時區:

foo=# select ts from messages; 
       ts    
------------------------------- 
2017-05-26 11:54:07.532796+01 
2017-05-26 11:54:08.536241+01 
2017-05-26 11:54:09.538119+01 
2017-05-26 11:54:10.541089+01 
2017-05-26 11:54:11.543262+01 

ts TIMESTAMP NOT NULL DEFAULT now(),給我本地時間沒有時區信息(危險):

foo=# select ts from messages; 
      ts    
---------------------------- 
2017-05-26 11:56:00.134596 
2017-05-26 11:56:01.13798 
2017-05-26 11:56:02.140586 
2017-05-26 11:56:03.143076 
2017-05-26 11:56:04.14565 

什麼字段定義會給我下面,當代碼在非UTC時區(例如BST,英國夏令時)的服務器上運行時:

foo=# select ts from messages; 
      ts    
---------------------------- 
2017-05-26 10:56:00.134596+00 
2017-05-26 10:56:01.13798+00 
2017-05-26 10:56:02.140586+00 
2017-05-26 10:56:03.143076+00 
2017-05-26 10:56:04.14565+00 

連:

foo=# select ts from messages; 
      ts    
---------------------------- 
2017-05-26 10:56:00.134596 
2017-05-26 10:56:01.13798 
2017-05-26 10:56:02.140586 
2017-05-26 10:56:03.143076 
2017-05-26 10:56:04.14565 

就可以了,如果不出意外是可能的(注:時間爲上午10點UTC,不是上午11點BST在這兩個例子以上)。

+1

timestamptz會做。您的客戶端時區將運行時間,該時間值將轉換爲UTC並保存到服務器。 postgres以UTC格式保存所有時間戳 –

回答

2

時間戳和時區是你的選擇:

t=# select now(); 
       now 
------------------------------- 
2017-05-26 11:04:19.240294+00 
(1 row) 

t=# set timezone to 'EET'; 
SET 
t=# select now(); 
       now 
------------------------------- 
2017-05-26 14:04:45.749123+03 
(1 row) 

,但如果你現在插入選擇(),它會保存在UTC時間,你可以檢查:

t=# select now() at time zone 'utc'; 
      timezone 
---------------------------- 
2017-05-26 11:05:01.045544 
(1 row) 

https://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-TIMEZONES

所有支持時區的日期和時間均以UTC格式存儲在內部。在顯示給客戶端之前,它們將 轉換爲由TimeZone 配置參數指定的區域中的本地時間。

+0

再次感謝。我並不瞭解Postgres正在給客戶端(客戶端)本地化的時間,而不是存儲本地化的時間。 – fadedbee