Часовой пояс Rails и летнее время

какое-то время я пытаюсь понять, как это время будет работать, и у меня возник вопрос:

Сегодня в моей стране мы находимся в летнее время (GMT-2). Поэтому пользователь моего приложения вводит время, например, 11:00 и публикует форму. Насколько я знаю, рельсы преобразуют эту дату в UTC и сохраняют в базе данных (mysql в моем случае), например: 13:00 UTC.

Когда я восстанавливаю эту запись, мне пришлось преобразовать ее в локальное время для отображения. Хорошо?

Мой вопрос: давайте предположим, что эта дата/время представляет дату/время в будущем, когда моя страна выходит из летнего времени (GMT-3). Rails сохранит 13:00 UTC? Сегодня, в летнее время, как будет местное время? И в будущем, как будет это местное время?

В принципе, мне всегда нужно показывать пользователю 11:00 AM.

спасибо.

Ответы

Ответ 1

Через 7 месяцев после того, как вы спросили, но, возможно, skip_time_zone_conversion_for_attributes = поможет - он сообщает AR не конвертировать временные интервалы при хранении или извлечении. См. [Временная метка ActiveRecord] (http://api.rubyonrails.org/classes/ActiveRecord/Timestamp.html), которая показывает пример:

class Topic < ActiveRecord::Base
  self.skip_time_zone_conversion_for_attributes = [:written_on]
end

- Кип

Ответ 2

Есть несколько мест, где может появиться часовая зона: установка по умолчанию операционной системы (или, возможно, учетной записи пользователя), сервер базы данных, Rails environment.rb.

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

Таким образом, ваш вопрос, похоже, сводится к "если это дневное время, я хочу компенсировать -3 часа, а другое - на -2 часа". Временные расширения Rails позволяют определить текущее смещение, например Time.zone.now.utc_offset, а Time#dst? сообщает вам, будет ли это переход на летнее время с этими двумя, вы можете условно вычитать дополнительный час (3600 сот секунд).