2014-04-19 96 views
3

我有一類方法是這樣的:設置日期時間爲UTC,而不是把它寫當前系統時間

def self.seed 
    InventoryPeriod.delete_all 
    (1..8).each do |i| 
     self.create! name: "name#{i}", start_datetime: DateTime.new(2014,i,1), end_datetime:DateTime.new(2014,i,-1), location_id: 12 
    end 
    end 

,但現在看來似乎應該寫在UTC數據庫(DateTime.new( 2014年,我,1).utc不這樣做)但它並沒有,基本上是8個小時。

例如:

| 51 | 2014-08-01 00:00:00 | 2014-08-31 00:00:00 

,但應該是:

| 51 | 2014-07-31 16:00:00 | 2014-08-30 16:00:00 

什麼是我們的最佳解決方案?希望有一些我不知道的鐵軌 - 看起來應該是這樣,因爲它必須是如此的通用。或者我可以在必要的時間內手動調整?

THX

回答

0

的問題是,當你做DateTime.new(y,m,d),時區默認爲UTC。因此,在您的示例中,它以UTC存儲DateTime,與您的預期相距僅8個小時。

這樣做

DateTime.new(2014,8,1,0,0,0, '+8') 
DateTime.new(2014,8,-1,0,0,0, '+8') 
DateTime.new(2014,8,1,0,0,0, '+8').getutc 
DateTime.new(2014,8,-1,0,0,0, '+8').getutc 

會給這個結果

2014-08-01T00:00:00+08:00 
2014-08-31T00:00:00+08:00 
2014-07-31T16:00:00+00:00 
2014-08-30T16:00:00+00:00 

這是插入到你的代碼。

(1..8).each do |i| 
    self.create! name: "name#{i}", start_datetime: DateTime.new(2014,i,1,0,0,0, '+8').getutc, end_datetime: DateTime.new(2014,i,-1,0,0,0, '+8').getutc, location_id: 12 
end 
2

如果你的屬性是時區知道,你希望跳過某些屬性時區轉換,那麼你可以做到以下幾點:

Model_Name.skip_time_zone_conversion_for_attributes = [:attribute_name] 

OR一般來說,你可以把這個模型裏面:

skip_time_zone_conversion_for_attributes 

編號:http://api.rubyonrails.org/v3.0.0/classes/ActiveRecord/Timestamp.html

對於這個WO rk,請確保您沒有在application.rb文件中指定任何特定時區。

或者,如果你想有一個固定的時區比UTC其他:

請參閱How to change default timezone for Active Record in Rails?

希望它能幫助:)

+0

如果它真的幫了你,請接受以供將來參考。 –

相關問題