2016-03-19 233 views
0

我覺得這個問題之前曾被問過,但迄今爲止,這些解決方案都沒有爲我工作。將時間和時區轉換爲UTC

由於使用Heroku的我也被綁在Postgres的(目前)

我存儲預約持有時間和時區。

然後我需要的是時間轉換爲UTC,這樣我可以在適當的時候

所以我@booking.arrival_date@booking.time_zone

我的解決方案迄今已與它執行的功能:

Time.zone = @booking.time_zone 

    arrival_date = Time.zone.parse @booking.arrival_date.to_s 
    @booking.arrival_date = arrival_date.utc 

    @booking.save 

但這不起作用。編輯:目前值停留在(轉換爲UTC,而不是)

任何幫助,將不勝感激由用戶選擇的時間:)

+0

「這不起作用」並沒有告訴我們有關實際發生的事情。你的意見是什麼?預期產出是多少?實際輸出是多少?您還應該考慮一些棘手的問題,例如當本地時間由於夏令時轉換而不明確或跳過時。 –

+0

嘿,我已經添加了編輯以顯示目前正在發生的事情。另外,我有大約6個小時的時間來玩,所以我可以在以後擔心夏令時和其他事情(如果有的話) –

+0

我們仍然不知道'Time.zone'的價值是什麼,或者基本上任何樣品。如果您可以製作一個簡短但完整的Ruby腳本來顯示問題 - 而不涉及任何其他問題 - 這可以更容易地幫助您。 –

回答

1

我不認爲你需要編寫任何代碼在所有。請在config/application.rb中查找您設置應用程序時區的內容。默認是UTC,你應該這樣離開它。同時查看Postgres默認時區。如果你在Heroku上也應該是UTC。

由於這是Rails,您的列很可能是TIMESTAMP WITHOUT TIME ZONE。然後在內部,您的所有時間將自動存儲在UTC中。所以如果你想對它們運行計算,那麼繼續。

這絕對是不好的:Time.zone = @booking.time_zoneTime.zone值是全局變量,是Rails配置的一部分。通過設置它你讓你的代碼線程不安全(這可能無關緊要),並讓一個請求污染另一個請求(可能會這樣做)。如果你需要把它放在某個地方,就說tz = @booking.time_zone

現在你可能需要做的是解析用戶提交的時間字符串,解釋爲從給定的時區。這是東西,你會在你的控制器處理:

h = booking_params 
tz = ActiveSupport::TimeZone[h[:time_zone]] 
h[:arrival_date] = tz.parse h[:arrival_date] 
@booking = Booking.new(h) 

當然,你應該添加一些檢查,缺失值,這適應自己的代碼,等等

這裏是一個article on time zones in Rails(由我)這可能會幫助你更清楚地考慮這一點。

+0

謝謝!我以錯誤的方式去討論,現在這是有道理的。另外,我在提問之前先閱讀你的博文,但是在我的挫折中(從問題),我沒有接受。 –