Подтвердить что ты не робот

Почему `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)

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

4b9b3361

Ответ 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.