我有这样的类方法:
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,i,1)。但是它没有这样做)但是它没有并且基本上是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 :(得分:2)
如果您的属性具有时区感知功能,并且您希望跳过某些属性的时区转换,则可以执行以下操作:
Model_Name.skip_time_zone_conversion_for_attributes = [:attribute_name]
或者通常你可以在模型中调用它:
skip_time_zone_conversion_for_attributes
参考:http://api.rubyonrails.org/v3.0.0/classes/ActiveRecord/Timestamp.html
为此,请确保您未在application.rb
文件中指定任何特定时区。
或者,如果您想要UTC以外的固定时区:
请参阅How to change default timezone for Active Record in Rails?
希望有所帮助:)
答案 1 :(得分:0)
问题在于,当您执行DateTime.new(y,m,d)
时,时区默认为UTC。因此,在您的示例中,它将DateTime
存储在UTC中,距您预期的仅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