2016-07-31 69 views
0

所以我在這裏使用gpx文件。注意一個選段:GPX和PostgreSQL的夏令時

<?xml version="1.0" encoding="UTF-8"?> 
<!-- GPSTrack 2.2.1 — http://bafford.com/gpstrack --> 
<gpx xmlns="http://www.topografix.com/GPX/1/1"> 
<trk> 
<name><![CDATA[2016-03-31 10-17-54]]></name> 
<trkseg> 
<trkpt lat="38.704859" lon="-8.970304"><ele>13.050667</ele><time>2016-03-31T09:17:51Z</time><!-- hAcc=95.768176 vAcc=10.000000 --></trkpt> 
<trkpt lat="38.704894" lon="-8.970324"><ele>13.050667</ele><time>2016-03-31T09:17:55Z</time><!-- hAcc=141.087476 vAcc=10.000000 --></trkpt> 
<trkpt lat="38.704859" lon="-8.970304"><ele>13.050667</ele><time>2016-03-31T09:17:55Z</time><!-- hAcc=95.768176 vAcc=10.000000 --></trkpt> 
<trkpt lat="38.704878" lon="-8.970343"><ele>13.150488</ele><time>2016-03-31T09:18:43Z</time><!-- hAcc=165.000000 vAcc=10.000000 --></trkpt> 

請參閱文件名?它給了我們10H17的時間。現在檢查每個點的時間。計算時間少一小時。

我還是不明白這裏的時代如何混亂。但這是問題的開始。

現在,我正在解析這些許多gpx文件,並將它們加載到PostgreSQL數據庫中。更具體地說,本表:

CREATE TABLE IF NOT EXISTS trips (
    trip_id SERIAL PRIMARY KEY, 

    start_location TEXT REFERENCES locations(label), 
    end_location TEXT REFERENCES locations(label), 

    start_date TIMESTAMP WITHOUT TIME ZONE NOT NULL, 
    end_date TIMESTAMP WITHOUT TIME ZONE NOT NULL, 

    bounds geography(POLYGONZ, 4326) NOT NULL, 
    points geography(LINESTRINGZ, 4326) NOT NULL, 

    timestamps TIMESTAMP WITHOUT TIME ZONE[] NULL 
); 

即使同時使用TIMESTAMP WITHOUT TIME ZONE點被加載有錯誤的小時(小於一小時)。這隻發生在夏令時生效後的幾天內。這裏的觀點:有沒有辦法檢查日期是否在DST時間,並且如果檢查時加上一個小時?

我檢查了tm_isdstdatetime.dst()但我還是不明白。

回答

0

如果您知道其中該本地時間應該在(假設在例如「歐洲/維也納」)要設置的時區名稱,您可以正常化值糾正UTC時間(或任何其他時區)這個表達式:

SELECT '2016-03-31T09:17:51Z'::timestamp AT TIME ZONE 'Europe/Vienna' AT TIME ZONE 'UTC' 

結果:

timezone 
-------------------- 
2016-03-31 07:17:51 

是的,應用AT ZIME ZONE兩次

由於您似乎在處理不同的時區,因此我會考慮在表格中使用timestamptz而不是timestamp

一定要使用時區,不是縮寫或簡單的時間偏移來獲得精確地調整爲DST。
我討厭夏令時的概念 - 它從不保存任何日光,但不斷浪費人們被它迷惑的寶貴時間。

對所有這一切詳細解釋:

+0

不錯,雖然我對DST同意你浪費了我們的時間,它肯定是好的,在夏天哈哈還有一個小時的陽光。 所以,關於我的問題,我理解你的答案,並且我改變了我的表格,使'TIMESTAMP WITH TIME ZONE'。雖然日期是在同一個國家收集的,但是這個DST內容被視爲一個時區。 使用'pgAdmin'工具我現在看到我的表格顯示了這樣的日期: '2016-03-31 09:17:51 + 01'。這意味着當我查詢日期並將其傳遞給我想要的任何函數時,它會認爲它是10:17,對吧? –

+0

@ Shoplifter.Doe:[正如鏈接的答案中所解釋的](*解釋*)(* http://stackoverflow.com/questions/9571392/ignoring-timezones-altogether-in-rails-and-postgresql/9576170#9576170),*顯示* 'timestamptz'適用於會話的時區設置。您可以再一次使用AT TIME ZONE構造獲得給定時區的顯示。當*將*轉換爲'日期'時,也會考慮當前的時區設置。 –

+0

是的,我知道了。會話的時區設置綽綽有餘。 「夏令時並不是人類有史以來最明智的想法之一。」 - 編程問題確實如此。 對於我來說,'SELECT start_date :: timestamp AT TIME ZONE'UTC'from trips'表達式是適用於我的那個。就像你的鏈接答案中的「加載的弩槍」一樣。 在我的前端,我可以用一些JS庫輕鬆處理這些日期。 我很不知道這些時區可能是一個痛苦。感謝您的教訓。 –