在Rails 3.0.20应用程序上的Ruby升级(从1.8.7)导致时区异常



我正在升级一个又大又旧又笨重的Rails应用程序的Ruby(主要是为了不需要在我重新格式化的笔记本电脑上重新安装REE),我被时区问题困扰得很厉害。基本上,从数据库中提取日期时间并不能正确地将它们转换为本地时间:

新系统- Ruby 2.1.2, Ubuntu 14.04

>> Time.zone.name
=> "Central Time (US & Canada)"
>> ActiveRecord::Base.time_zone_aware_attributes
=> true
>> ActiveRecord::Base.default_timezone
=> :utc
>> Transaction.last.created_at
=> 2014-07-15 02:09:02 UTC
>> Transaction.last.created_at_before_type_cast
=> 2014-07-15 02:09:02 UTC
>> Transaction.last.created_at.localtime
=> 2014-07-14 21:09:02 -0500
>> exit
$ date
Mon Jul 14 22:27:50 CDT 2014

老系统——REE, Ubuntu 12.04

>> Transaction.last.created_at
=> Mon, 14 Jul 2014 22:03:11 CDT -05:00
>> Transaction.last.created_at_before_type_cast
=> Tue Jul 15 03:03:11 UTC 2014
>> Transaction.last.created_at.localtime
=> Mon Jul 14 22:03:11 -0500 2014

您可以看到,我已经确保设置了time_zone_aware_attributes,设置了区域(我在environment.rb中设置了它),并且ActiveRecord 以UTC存储时间(如预期的那样)。我被这个难住了。有人有什么想法吗?

  before :all do
    @current_tz = Time.zone
    Time.zone = 'Pacific Time (US & Canada)'
  end
  after :all do
    Time.zone = @current_tz
  end
  it 'should report time as Pacific time' do
    shift = FactoryGirl.create(:shift)
    new_obj = Transaction.create(shift: shift, time: DateTime.new(2013, 3, 31, 0, 0, 0, 0), amount: 0)
    new_obj.reload
    I18n.localize(new_obj.time, format: :timeonly).should_not == '12:00 am' #We created it with a UTC date, but it should get I18n'd to Pacific time
  end
#en.yml
  time:
    formats:
      timeonly: "%l:%M %p"

上述测试失败。I18n的东西似乎完全坏了。

更新2

我似乎已经把问题隔离到1.9.3 -> 2.1。使用1.9.3很好,我想,我想我会在新服务器上运行它,直到我升级Rails。伤心。

尝试使用I18n帮助程序来格式化/偏移您的时间输出-并强制设置时区(如果需要)

puts I18n.localize(Transaction.last.created_at, format: :long)

Time.use_zone("Central Time (US & Canada)") do
  puts I18n.localize(Transaction.last.created_at, format: :long)
end

我建议您也将默认的Time.zone设置为UTC,并根据需要明确地为每个用户更新它-这里有一篇博客文章可能会有所帮助:http://jessehouse.com/blog/2013/11/15/working-with-timezones-and-ruby-on-rails/

相关内容

  • 没有找到相关文章

最新更新