Временные метки Rails не используют правильный часовой пояс - PullRequest
14 голосов
/ 27 октября 2010

Я немного озадачен часовыми поясами в рельсах. Я хочу, чтобы мое приложение rails использовало британское летнее время (например, летнее время в США) для отметок времени, установленных в updated_at и create_at в моих моделях. Я изменил свой environment.rb, чтобы сказать

  config.time_zone = 'London'

Сервер ubuntu, на котором запущено мое приложение, по-видимому, использует BST для своего времени: например, в командной строке, если я наберу 'date', я получу текущее время (без смещения на час). В консоли рельсов я вижу следующее:

>> time = Time.now
=> Wed Oct 27 16:29:17 +0100 2010
>> time.zone
=> "BST"

Все хорошо. Однако, если я создаю новый объект модели AR и сохраняю его, отметки времени будут получены час назад. Итак, похоже, что это использует UTC. Теперь я могу видеть логику в этом: поскольку временные метки могут использоваться в логике модели, вы хотите, чтобы они основывались на неизменном эталонном времени, т.е. UTC. Но это странное поведение, которого я не понимаю:

#change a record and save it
>> someobj.save
=> true
#object's updated_at is one hour ago
>> someobj.updated_at
=> Wed, 27 Oct 2010 15:34:22 UTC +00:00
>> Time.now
=> Wed Oct 27 16:34:31 +0100 2010
#however, Time.now - object's updated at is just a few seconds.
>> Time.now - someobj.updated_at
=> 15.305549

Итак, перед выполнением вычитания updated_at конвертируется в текущий часовой пояс.

Причина, по которой я хочу показать дату в текущем часовом поясе, заключается только в отчетах о состоянии и т. Д. В представлениях: если кто-то что-то обновляет, я хочу, чтобы он увидел, что оно было обновлено «1 минуту назад», а не «час назад». .

Может ли кто-нибудь сбить меня с толку? ура, максимум

РЕДАКТИРОВАТЬ: Моя непосредственная проблема, показывающая правильное время в статусе, решается с помощью помощника time_ago_in_words, который настраивается на часовой пояс. Я все еще хотел бы, чтобы кто-то объяснил, что происходит с временными метками, хотя:)

Ответы [ 2 ]

40 голосов
/ 27 октября 2010

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

Если вы хотите узнать, какая временная метка находится в вашем местном часовом поясе, выпросто нужно спросить об этом таким образом:

someobj.updated_at.localtime
2 голосов
/ 27 октября 2010

Обратите внимание на смещение, указанное в конце времен - первое смещение равно 0, а второе равно 1. Когда происходит вычисление времени, смещение включается автоматически, так что вычитание дает вам правильный результат.someobj.updated_at и Time.now каждый отображает свое значение в другом часовом поясе, поэтому они на самом деле находятся на расстоянии всего 9 секунд, а не 1 час и 9 секунд.

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