簡體   English   中英

“date_part('epoch',now()在時區'UTC')”與postgresql中時區'UTC'的“now()不同時”

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM