[英]“date_part('epoch', now() at time zone 'UTC')” not the same time as “now() at time zone 'UTC'” in postgresql
我正在編寫一個基於Web的前端到數據庫(PHP / Postgresql),我需要存儲各種日期/時間。 時間應始終在當地時間輸入客戶端,並在當地時間顯示。 出於存儲目的,我將所有日期/時間存儲為整數(UNIX時間戳)並標准化為UTC。 一個特定的字段有一個限制,即填寫的時間戳不允許在將來,所以我嘗試使用數據庫約束...
CONSTRAINT not_future
CHECK (timestamp-300 <= date_part('epoch', now() at time zone 'UTC'))
如果瀏覽器和服務器之間略有不同步的時間,-300將提供5分鍾的余地。 問題是,在提交當前時間時,此約束始終失敗。 我做了測試,發現了以下內容。
在PostgreSQL客戶端:
SELECT now()
- 返回正確的本地時間
SELECT date_part('epoch', now())
- 返回UTC的unix時間戳(通過將值輸入PHP中的日期函數進行測試,校正其對我的時區的補償)
SELECT date_part('epoch', now() at time zone 'UTC')
- 在兩個時區偏移西方返回一個unix時間戳,例如我在GMT + 2,我得到一個GMT-2時間戳。
我已經明白,放棄“在時區'UTC'”將解決我的問題,但我的問題是,如果'epoch'意味着返回一個unix時間戳,AFAIK總是打算用UTC,為什么會已經在UTC中的'時代'得到糾正? 這是一個錯誤,或者我在這里錯過了關於定義/正常行為的一些信息。
“now()在時區'UTC'”值是您當前時間移至UTC,然后轉換為TIMESTAMP沒有時區 。
所以你給“date_part”一個沒有時區的TIMESTAMP(換句話說是未知的時區),並期望得到它與已知時區的固定時間戳之間的差值(“EPOCH”,1970-01-01 00: 00:00 UTC)。
Postgres需要TIMESTAMP WITH TIME ZONE來計算這個。 因此,它將您的值轉換為時區'UTC', 假設它在您的時區並計算差異。
就像是:
select ((now() at time zone 'UTC') at time zone '<your_time_zone>') at time zone 'UTC';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.