3

我升級大了,老了,笨重的Rails應用程序的紅寶石(大多時候是這樣,我沒有在我重新格式化重新安裝REE筆記本電腦),我受到時區問題的困擾。基本上,拉動了日期時間的數據庫是不正確它們轉換爲本地時間:Ruby on Rails的升級(自1.8.7)3.0.20應用程序引起的時區怪事

新系統 - 紅寶石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。傷心。我仍然喜歡聽到關於修復的任何建議。

+2

我有軌4.0跑紅寶石2.1代碼和Th輸出e18n的東西是5點。也許軌道3.0.x和紅寶石2.1之間的不兼容?這是用Ruby 2.0完全兼容軌道的最早版本是像3.2.16,所以如果有一些事情是當你把在軌破3.0與2.1紅寶石正確 –

+0

我也不會感到驚訝大規模。有幾個補丁(我不得不使用AR協會被破壞)來嘗試使它們兼容,但是這個補丁非常令人驚訝。將項目從3.0升級到3.2(或4)並不是我現在有時間的事情......所以我放棄了讓它在Ruby 2上運行的目標。=)謝謝! – alkaloids

回答

1

嘗試使用的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/

+0

謝謝,這可能是很好的長期,但絕對意外的一個紅寶石升級......這個網站是爲本地市場,所以所有的用戶/操作是在一個單一的時區,但我熟悉所有的設置每個用戶時區的做法。 – alkaloids

+0

而且,重建這個應用程序的所有視圖以使用像這樣的本地化時間並不真正處理。 – alkaloids

+0

此外,I18n部分也無法正常工作(請參閱更新) – alkaloids