Проблема с принятым ответом заключается в том, что он, к сожалению, не обрабатывает случаи, когда две разные часовые пояса имеют одинаковое смещение 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
...