Мне понадобилась та же функциональность в немного более простом случае базы данных почтовых индексов США, которая включает смещение часов 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
...