Летнее время не рассчитано должным образом в Rails 2.3.5? - PullRequest
2 голосов
/ 09 сентября 2010

У меня очень странная проблема с летним временем в моем приложении.По какой-то причине всякий раз, когда я получаю время из таблицы, оно не подстраивается под DST.Например, если я создаю новое время в консоли, в соответствующем часовом поясе, запишу его в базу данных, а затем попытаюсь извлечь его из базы данных, оно возвращается на один час раньше.

Вотпример:

Здесь мы видим, что при использовании консоли создание нового времени в 15:00 EST равно 19:00 UTC (с учетом поправки на летнее время, что делает его -0400 вместо обычного-0500):

ruby-1.8.6-p114 > Time.zone
 => #<ActiveSupport::TimeZone:0x12b1b68 @name="UTC", @tzinfo=nil, @utc_offset=0> 
ruby-1.8.6-p114 > Time.zone = "Eastern Time (US & Canada)"
 => "Eastern Time (US & Canada)" 
ruby-1.8.6-p114 > Time.zone.parse("15:00")
 => Thu, 09 Sep 2010 15:00:00 EDT -04:00 
ruby-1.8.6-p114 > Time.zone.parse("15:00").utc
 => Thu Sep 09 19:00:00 UTC 2010 
ruby-1.8.6-p114 > Time.zone.parse("15:00").dst?
 => true 

Теперь я пытаюсь записать то же самое время в базу данных и получить ее обратно:

ruby-1.8.6-p114 > b = Book.new
 => #<Book id: nil, return_time: nil, created_at: nil, updated_at: nil> 
ruby-1.8.6-p114 > b.return_time = Time.zone.parse("15:00")
 => Thu, 09 Sep 2010 15:00:00 EDT -04:00 
ruby-1.8.6-p114 > b.save
 => true 
ruby-1.8.6-p114 > result = Book.find(:last).return_time
 => Sat Jan 01 19:00:00 UTC 2000 
ruby-1.8.6-p114 > result.zone
 => "UTC" 
ruby-1.8.6-p114 > result.in_time_zone
 => Sat, 01 Jan 2000 14:00:00 EST -05:00 
ruby-1.8.6-p114 > result.dst?
 => false 

В моем environment.rb есть это:

config.time_zone = 'UTC'

И application_controller.rb имеет следующее:

before_filter :set_user_time_zone

def set_user_time_zone
if current_user
  Time.zone = current_user.time_zone
else
  Rails.logger.error '[Time.zone.now.to_s][ERROR]: Missing current_user from in set_user_time_zone!'
end

end

Есть какие-нибудь идеи относительно того, что здесь может происходить и как это исправить?Я занимаюсь этим уже несколько дней, так что любая помощь будет очень признательна!

Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 10 сентября 2010

Похоже, вы экономите только часть времени; обратите внимание, как часть даты идет от Thu, 09 Sep 2010 до Sat, 01 Jan 2000. Поскольку расчет времени перехода на летнее время зависит от даты, вероятно, именно здесь вы теряете информацию. (1 января не в летнее время, поэтому, принимая эту дату, расчет летнего времени является правильным). Вам, вероятно, нужно сохранить DATETIME в базе данных, а не просто TIME.

1 голос
/ 09 сентября 2010

Я не уверен, какую версию Rails вы используете, но у меня была та же проблема в 2.1.2. Кажется, что библиотека с часовым поясом просто не работает пол года, но разработчики не думали, что стоит переключаться; надеюсь, они уже переосмыслили это решение.

В любом случае мы использовали плагин tzinfo_timezone , который правильно вычисляет смещения UTC в летнее время.

...