Рельсы часовой пояс со смещением - PullRequest
22 голосов
/ 26 мая 2011

Так что, похоже, у rails довольно хорошая поддержка часовых поясов, но я столкнулся с требованием, которое, я надеюсь, уже решено, и я просто не вижу его в API.

IХотелось бы найти TimeZone на основе смещения.Причина в том, что я подключился к API, который возвращает мне часовой пояс пользователя как смещение и не хочет заново изобретать колесо, превращающее это смещение в Rails TimeZone, чтобы остальная часть приложения могла использовать его должным образом.

Есть предложения?Спасибо за помощь!

Ответы [ 2 ]

40 голосов
/ 27 мая 2011

Вы можете получить часовой пояс, используя метод [] для ActiveSupport::TimeZone.Вы можете передать имя часового пояса, часовое смещение или второе смещение.Например:

ActiveSupport::TimeZone["America/Los_Angeles"]                              
 => (GMT-08:00) America/Los_Angeles
ActiveSupport::TimeZone[-8]                              
 => (GMT-08:00) America/Los_Angeles

Но имейте в виду, что смещение не эквивалентно часовому поясу, поскольку несколько часовых поясов могут иметь одно и то же смещение в любой день.

0 голосов
/ 30 марта 2018

Проблема с принятым ответом заключается в том, что он, к сожалению, не обрабатывает случаи, когда две разные часовые пояса имеют одинаковое смещение utc.

Например, -7 может означать Аризону или Денвер, которые являются двумя РАЗЛИЧНЫМИ часовыми поясами («Америка / Феникс» и «Америка / Денвер»), поскольку Аризона не отмечает переход на летнее время.

ActiveSupport :: TimeZone [-7] возвращает только один из этих двух допустимых часовых поясов.

Мне понадобилась та же функциональность в немного более простом случае базы данных почтовых индексов США, которая включает смещение часов UTC и Y /Поле N, указывающее, участвует ли оно в летнем времени, поэтому почтовые индексы западного побережья США в этой базе данных имеют «-8» и «Y».

Я не смог найти встроенный метод Rails, чтобы сделать это, поэтому я вручную создал поисковый хеш, ключом которого являются поля UTC & DST, соединенные, например, "# {utc} # {dst}"и значение является именем часового пояса.Этот метод может работать и для смещений utc, таких как «5.5» (Индия).

В методе, который выполняет поиск, задаются значения utc и dst, я указываю часовой пояс по умолчанию (например, западное побережье США)) в случае, когда поиск по хешу возвращает ноль, потому что неожиданное значение, такое как "-5N" (так как у восточного побережья нет никаких состояний без DST, которые никогда не должны возникать).

Но тот же метод могприменять глобально, создавая хеш, который представляет все возможные часовые пояса со значениями Y и N для перехода на летнее время.

class MyZip

HOUR_DST_TO_TIMEZONE_NAME = {
  "-5Y" => "Eastern Time (US & Canada)",
  "-6Y" => "Central Time (US & Canada)",
  "-7Y" => "Mountain Time (US & Canada)",
  "-7N" => "Arizona",
  "-8Y" => "Pacific Time (US & Canada)",
  "-9Y" => "Alaska",
  "-10N" => "Hawaii"
  }

def self.timezone_name_from_zip_hour_dst(utc, dst)
  key = "#{utc}#{dst}" 
  return HOUR_DST_TO_TIMEZONE_NAME[key] || MyZip.unknown_timezone_name
end
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...