2015-11-05 83 views
1

我有一個表中有一個日期時間字段名爲date。當爲了插入新行而進行POST時,從客戶端(瀏覽器)發送的日期看起來像2015-11-20T14:30:00+10:00,這實際上是一個正確的日期和時區。Rails,Postgres和時區

但是,在Postgres裏面,這個日期已被插入爲2015-11-20 04:30:00.000000,正如你所看到的,它與上述內容完全不一樣。我知道問題與時區有關。但我似乎無法找出解決辦法。

有關信息,我已經配置我的應用程序時區:

class Application < Rails::Application 
    config.time_zone = 'Brisbane' 
end 

想法?

回答

3

2015-11-20T14:30:00+10:00意味着14:30本地時間爲UTC提前10小時非常有用的和容易。您的數據庫字段反映了正確的UTC值04:30。這通常是期望的行爲,尤其是如果該值表示時間戳 - 發生的某個日期和時間(過去時)。

在PostgreSQL,有兩種不同類型的時間戳字段(reference

  • TIMESTAMP WITH TIME ZONE字段接受一個包含時區偏移的輸入。然後它將該值轉換爲UTC以進行存儲。在檢索時,它使用會話的timezone設置。

  • TIMESTAMPTIMESTAMP WITHOUT TIME ZONE只存儲給定的日期和時間,忽略任何偏移量,不轉換爲UTC。

大多數情況下,您的確應該使用TIMESTAMP WITH TIME ZONE。如果您需要保留本地日期和時間值(例如安排未來事件和計算工作時間),則只應使用TIMESTAMP WITHOUT TIME ZONE。對於這些情況,將日期和時間分割成單獨的DATETIME字段通常更有意義。

最後一件事 - 如果您可以避免它,請避免使用Rails time zones並使用標準tzdb zones。 「澳大利亞/布里斯班」是完全相當於Rails「布里斯班」時區的tzdb標識符。請參閱timezone tag wiki底部的Rails時區部分。

+0

好的謝謝你的澄清。我檢查過從Rails顯示日期('04:30'),你說得對,它與我的時區相符。 但是,有一些我不明白。爲什麼Rails時間戳實際上保存正確,而不是這個?我正在構建的系統是一個時間表應用程序。爲了進行維護,我們經常檢查原始數據庫查詢的統計用途。看到'04:30'而不是'14:30'實際上很難維護。 – lkartono

+0

如果不知道更多關於您的特定風景和代碼的內容,很難回答,但請通過http:// stackoverflow查看。com/questions/2532729 /日光節約時間和時區最佳做法 –

+0

感謝您的鏈接。真的很有用:) – lkartono

0

我發現這個寶石是正確設置時間https://github.com/kbaum/browser-timezone-rails

+0

感謝您的回答。不幸的是,服務器的時區不能依賴於瀏覽器。無論用戶身在何處,該要求總是與服務器時區相關。無論如何,這個寶石可能是有用的一天或其他,所以謝謝分享:) – lkartono