已接受答案的问题在于,遗憾的是它无法处理两个不同时区具有相同 UTC 偏移量的情况。
例如,-7 可能指的是亚利桑那州或丹佛,它们是两个不同的时区(“美国/凤凰城”和“美国/丹佛”),因为亚利桑那州不遵守夏令时。
ActiveSupport::TimeZone[-7] 仅返回这两个有效时区之一。
在美国邮政编码数据库的稍微简单的情况下,我需要相同的功能,其中包括 UTC 小时偏移量和指示它是否参与夏令时的 Y/N 字段,因此该数据库中的美国西海岸邮政编码都具有“ -8”和“Y”。
我找不到内置的 Rails 方法来执行此操作,因此我手动创建了一个查找哈希,其中键是 UTC 和 DST 字段连接,例如“#{utc}#{dst}”和值是时区名称。此方法也适用于“5.5”(印度)等 UTC 偏移量。
在进行查找的方法中给出了 utc 和 dst 值,我指定了一个默认时区(例如美国西海岸),以防哈希查找返回 nil,因为诸如“-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
...