簡體   English   中英

PostgreSQL中夏令時的時區

[英]Time zone with daylight savings times in PostgreSQL

我們正在部署我們自己的流量計(很像USGS規格: http ://waterdata.usgs.gov/usa/nwis/uv?site_no = 03539600)所以我們皮划艇運動員知道是否有足夠的水來划水流並且不要浪費時間和氣體去那里。 我們希望在橫跨東部和中部時區的東南白水區安裝其中一些。

我正在使用記錄的默認值current_time存儲插入記錄的時間。 我想稍后使用MM/DD/YYYY HH12:MI AM TZ格式顯示數據,輸出類似於03/12/2012 01:00 AM CDT讀數。 我也希望輸出能夠意識到日光節省時間的變化,所以當我們“向前”和“退回”時,前一句的最后部分會在CST和CDT之間發生變化。 這一變化發生在今年3月11日,我在下面的DST線兩側都包含了日期。 我正在使用我的Windows 7筆記本電腦進行開發,之后我們將在Unix機器上進行部署。 Postgres顯然發現我的Windows電腦設置在美國東部時區。 我正在嘗試使用“沒有時區的時間戳”字段和“帶時區的時間戳”字段但無法使其工作。

我已經嘗試在我的選擇中使用“在時區”,並且每件事都在工作,直到顯示時區為止。 當我在CDT要求時間時,實際小時是時間戳的一部分被正確地減去一個小時。 但EDT顯示在輸出中。

SELECT reading_time as raw,
       reading_time at time zone 'CDT',
       to_char(reading_time at time zone 'CDT',
           'MM/DD/YYYY HH12:MI AM TZ') as formatted_time
  FROM readings2;

"2012-04-29 17:59:35.65";"2012-04-29 18:59:35.65-04";"04/29/2012 06:59 PM EDT"
"2012-04-29 17:59:40.19";"2012-04-29 18:59:40.19-04";"04/29/2012 06:59 PM EDT"
"2012-03-10 00:00:00";"2012-03-10 00:00:00-05";"03/10/2012 12:00 AM EST"
"2012-03-11 00:00:00";"2012-03-11 00:00:00-05";"03/11/2012 12:00 AM EST"
"2012-03-12 00:00:00";"2012-03-12 01:00:00-04";"03/12/2012 01:00 AM EDT"

我將每個儀表所在的時區存儲在一個字符變化字段中的單獨表格中。 我考慮過只將這個值附加到時間輸出的末尾,但我希望它在沒有我干預的情況下從CST更改為CDT。

謝謝你的幫助。

您可以考慮使用完整的Olsen樣式時區名稱 ,而不是使用CDT或CST等時區名稱 在中央時間的情況下,您可以選擇時區。 要么匹配您的位置,例如America/Chicago ,要么只是US/Central 這可確保PostgreSQL使用Olsen tz數據庫自動確定夏令時是否適用於任何給定日期。

你肯定想要一個TIMESTAMP WITH TIME ZONE列(在PostgreSQL中也被稱為timestamptz )。 這將以UTC格式存儲時間戳,以便它代表特定的時刻。 相反的是,顧名思義,它保存時區在列-你可以與自己選擇的時區查看檢索到的時間戳AT TIME ZONE短語。

TIMESTAMP沒有時區的語義令人困惑,幾乎無用。 我強烈建議您根據所描述的內容完全不使用該類型。

關於在CHARACTER VARYING列中存儲時間戳的問題,我真的很困惑。 這似乎可能是問題的一部分。 如果你可以從一開始就將它存儲在timestamptz ,我懷疑你會遇到更少的問題。 除此之外,使用-04表示法來抵消UTC是最安全的; 但這對我來說似乎更多的工作沒有任何好處。

您可以使用Guan Yang的答案中建議的格式創建已知時區的表,然后對該表使用外鍵列。 有效的時區可以從pg_timezone_names獲得我在這個相關的答案中已經詳細介紹了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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