将DateTime设置为UTC而不是将其写入当前系统时间

时间:2014-04-19 04:13:48

标签: ruby-on-rails

我有这样的类方法:

  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

2 个答案:

答案 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