Как работать с часовыми поясами в приложении Rails с событиями - PullRequest
0 голосов
/ 16 сентября 2009

У меня есть приложение Rails для групп. Группы могут импортировать свои шоу, которые происходят в разных часовых поясах. Похоже, тонна работы для хранения этих событий в UTC. Я должен был бы выяснить часовой пояс для любого созданного шоу и затем преобразовать обратно в местный часовой пояс шоу при отображении для пользователя. Есть ли простой плагин для получения смещения UTC на основе геолокации? Это, вероятно, помогло бы, но кто-нибудь видит какие-либо основные причины, почему я должен хранить здесь в UTC? Я понимаю, что хранить временные метки в UTC, вероятно, хорошая идея ... но время группового события?

Ответы [ 3 ]

4 голосов
/ 06 июня 2010

Я работаю над чем-то похожим - сайтом со списком событий. В моей ситуации важно стандартизировать время (в UTC), потому что у нас есть время для объявления и продажи, о которых нужно беспокоиться (т. Е. Когда события появляются на сайте и когда появляются ссылки в продаже), а не только отображение времени начала события (которому самому все равно, в каком часовом поясе он находится).

Переход от времени UTC в базе данных к местному времени для данного места (т. Е. Для отображения местного времени в списке событий) довольно просто, используя что-то вроде e.start.in_time_zone("#{e.venue.time_zone}"). Что я не мог понять, так это получить местное время в точке ввода данных, распознаваемое как местное время, которое необходимо преобразовать в UTC, не имея дело с изменением Time.zone.

Я нашел то, что работает. Проверьте это сообщение: http://steveluscher.com/archives/changing-a-times-zone-in-rails-keeping-the-same-local-representation. Я добавил новый файл (time_zone_support.rb) в мою директорию config / initializers. Вот содержимое:

module ActiveSupport
  class TimeWithZone
    def zone=(new_zone = ::Time.zone)
      # Reinitialize with the new zone and the local time
      initialize(nil, ::Time.__send__(:get_zone, new_zone), time)
    end
  end
end

Это позволяет в консоли:

>> e.starts = Time.zone.parse("2010-09-12 10:00 am")
=> Sun, 12 Sep 2010 10:00:00 UTC +00:00
>> e.starts.zone = e.time_zone
=> "Pacific Time (US & Canada)"
>> e.starts
=> Sun, 12 Sep 2010 10:00:00 PDT -07:00
>> e.save
=> true

Надеюсь, это вам тоже поможет!

1 голос
/ 26 января 2010

Здесь вам не нужно беспокоиться о UTC, так как событие связано с временем и местом, в котором оно происходит. Если кто-то едет с Гавайев в Сан-Франциско на шоу в 8 вечера, это не значит, что шоу начнется для него в 16:00. Таким образом, вы можете хранить обычное время и местоположение, не беспокойтесь о TZ (так как, по-видимому, у полос просто есть форма времени и местоположения) и хранить это в db.

Что касается Rails, все события будут происходить в TZ, в которой он существует, только с этим забавным атрибутом "location", который сообщает читателю, что событие действительно находится на расстоянии 1000 миль. Это означает, что он может делать обычные автоматические преобразования TZ для себя, но читатель не сможет сказать. Это будет просто преобразование во время, введенное группой в первую очередь. 20:00 + «Лос-Анджелес», 10:00 «Талса, ок.»

Единственный недостаток - это то, транслируются ли передачи по Интернету или что-то в этом роде, где место не связано с событием, на котором вы все равно делаете вышеупомянутое, но пусть зритель / потенциальный член аудитории выбирает их собственный TZ (или геолокация их), и приложение должно выполнить преобразование при отображении в представлении.

0 голосов
/ 16 сентября 2009

Один из способов сделать это - сохранить их все в UTC, а затем позволить пользователю решить, в каком часовом поясе они хотят его видеть.

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