Почему `config.time_zone`, кажется, ничего не делает?
В application.rb
говорится:
Установите Time.zone по умолчанию для указанной зоны и сделайте активную запись автоматически конвертировать в эту зону. Запустите "rake -D time" для списка задач для поиска имен часовых поясов. Значение по умолчанию - UTC.
Но установка config.time_zone = 'Central Time (US & Canada)'
или config.time_zone = 'Eastern Time (US & Canada)'
не влияет - поле created_at
в модели сохраняется в UTC.
В соответствии с этот ответ railsforum:
config.time_zone просто позволяет рельсам знать что ваш сервер настроен на это часовой пояс, поэтому, когда он записывает даты база данных, которую он может правильно конвертировать это к UTC.
Если это так, то почему, когда мое системное время Pacific Time (US & Canada)
и config.time_zone = 'Central Time (US & Canada)'
или config.time_zone = 'Eastern Time (US & Canada)'
, время created_at
- это правильный UTC? Если это неверно?!
Потому что, если время PST равно 8 PM, тогда EST составляет 11 PM, а UTC - 4 часа.
Предполагая, что Rails делает Time.now
, это будет 8 вечера. И мы сказали Rails, что сервер находится в EST. Таким образом, 8 вечера будут временем EST в отношении Rails, а UTC будет равен 5 AM UTC, что было бы неверным (поскольку фактическое время составляет 8 PM PST/11 PM EST, то есть 4 часа по UTC)
Что здесь происходит?
Ответы
Ответ 1
Вот список понятий и вещей, которые могут вам помочь:
config.time_zone
не устанавливает "Серверное время", которое обычно контролируется вашей операционной системой.
Rails всегда сохраняет ваши даты в UTC в базе данных (если вы не измените другую настройку).
Time.now
возвращает местное время для вашего компьютера в вашем часовом поясе, а также включает локальное смещение часового пояса от вашей операционной системы, что означает Ruby, и поэтому Rails знает, как преобразовать localtime в UTC. Вы можете попробовать это, используя irb
напрямую, поэтому библиотеки Rails не загружаются:
ctcherry$ irb
>> Time.now
=> Mon Feb 21 20:53:14 -0800 2011
>>
Если установлено config.time_zone
или Time.zone
, чтобы сказать EST, Rails ожидает, что если вы установите атрибут datetime, который вы имеете в виду для этого времени и даты, чтобы быть в указанном часовом поясе, в этом случае EST. Именно поэтому вы устанавливаете Time.zone равным часовому поясу ваших конечных пользователей, чтобы они могли использовать свое местное время и даты, и вы можете передавать их непосредственно в свои модели ActiveRecord, а Rails может конвертировать их в UTC для хранения в базе данных.
Помогает ли это вообще?
Ответ 2
Вам нужно использовать in_time_zone
(т.е. Time.now.in_time_zone
), чтобы получить что-то другое, кроме UTC.