Почему `config.time_zone`, похоже, ничего не делает? - PullRequest
21 голосов
/ 22 февраля 2011

В 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 вечера, тогда EST 11 вечера, а UTC 4 часа. Предполагая, что Rails делает Time.now, это будет 8 вечера. И мы сказали Rails, что сервер находится в EST. Таким образом, 8 часов вечера будет время EST для Rails, и тогда UTC будет 5 часов утра UTC, что будет неверно (поскольку фактическое время - 8 часов вечера PST / 11 часов вечера EST, то есть 4 часа утра UTC)

Что здесь происходит?

Ответы [ 2 ]

46 голосов
/ 22 февраля 2011

Вот список понятий и вещей, которые могут вам помочь:

config.time_zone не устанавливает «Время сервера», которое обычно контролируется вашей операционной системой.

Rails всегда хранит ваши даты в формате UTC в базе данных (если вы не изменили другую настройку).

Time.now возвращает местное время для вашего компьютера в вашем часовом поясе, а также смещение местного часового пояса от вашей операционной системы, что означает Ruby, и, следовательно, Rails знает, как преобразовать локальное время в 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 для хранения в базе данных.

Помогает ли это вообще?

15 голосов
/ 22 февраля 2011

Вам нужно использовать in_time_zone (то есть Time.now.in_time_zone), чтобы получить что-то отличное от UTC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...