Статьи

Часовые пояса в Rails 2.1

Неудивительно, что поддержка часовых поясов является довольно важным компонентом веб-приложений, поскольку сеть действительно является глобальной средой. Если вы создаете приложение, которое имеет дело со временем, например, отправляет напоминания в календаре или даже что-то такое же простое, как правильное отображение метки времени, вам, возможно, следует опасаться того факта, что разные пользователи живут в разных часовых поясах. Звучит легко? Тогда читайте дальше …

Краткий справочный урок. Очевидно, что не все части света находятся в дневное время в одно и то же время, когда в Австралии середина дня, а в Соединенных Штатах — середина ночи. Чтобы убедиться, что полдень означает то же самое в Перте, что и в Атланте, мир разбит на часовые пояса, вращающиеся вокруг всемирного координированного времени (UTC), проходящего через Гринвич, Великобритания (именно поэтому UTC также называют средним временем по Гринвичу или GMT), в диапазоне от -12 по Гринвичу до +14 по Гринвичу.

Поскольку каждый часовой пояс определяется относительно этого воображаемого времени, было бы разумно использовать его в качестве основы в нашем приключении по кодированию часовых поясов. В Rails вы можете указать ActiveRecord сохранять все даты в формате UTC, установив следующее значение в вашем /config/environment.rb:


config.time_zone = 'UTC'

Самый очевидный и простой способ вычислить местное время — добавить смещение к текущему времени по Гринвичу — и если это все, что вам нужно сделать, я мог бы завершить эту статью прямо сейчас, но, увы, это не всегда так просто, потому что летнего времени.

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

Так что же нам делать? К счастью, существует набор библиотек, называемых базой данных zoneinfo (или базой данных Olson), которые в основном документируют каждый переход DST для каждой страны. Gem tzinfo является версией этой библиотеки для Ruby, и до Rails 2.1 вам нужно было работать с этой библиотекой (возможно, с помощью плагина), чтобы заставить работать часовые пояса, но теперь она встроена в Rails 2.1 и выше.

Первым шагом будет сохранение информации о часовом поясе ваших пользователей. Самый простой способ сделать это — сохранить их строку часового пояса в соответствии с их пользовательскими данными, что я хотел бы сделать, используя сгруппированный тег выбора:

 
<select name="user[timezone]" id="user_timezone">
  <%= option_groups_from_collection_for_select TZInfo::Country.all.sort, "zones", "name", "identifier", "friendly_identifier", @user ? @user.timezone : nil %>
 </select&gt

Который сохранит записи типа «Австралия / Мельбурн» или «Америка / Лос-Анджелес». Далее вам просто нужно указать Rails, в каком часовом поясе находится каждый запрос, что теперь очень просто с помощью метода Time.zone =. Вызовите этот метод в before_filter в application.rb, и он установит часовой пояс для каждого запроса:

 
def timezone_manager
  Time.zone = current_user.timezone if current_user && current_user.timezone
end

Легко и приятно! Каждый раз, когда вы используете или распечатываете часовой пояс, он будет находиться в локальной зоне пользователя.

Если вы хотите узнать больше о том, что вы можете сделать с помощью поддержки часовых поясов в Rails 2.1, обратитесь к фантастическому учебнику по адресу: http://mad.ly/2008/04/09/rails-21-time-zone- поддержка-ан-обзор /