问题描述
|
因此,Rails似乎对时区提供了很好的支持,但是我遇到了一个要求,就是希望我已经解决了这个问题,而且我只是在api中看不到它。
我希望能够基于偏移量找到一个TimeZone。原因是我要连接到一个API,该API可以将用户时区作为偏移量返回给我,而又不想重新发明将偏移量转换为Rails TimeZone的轮子,以便该应用程序的其余部分可以使用它正确地。
有什么建议么?谢谢您的帮助!
解决方法
您可以使用
ActiveSupport::TimeZone
上的[]
方法获得时区。您可以传递时区名称,小时偏移量或秒偏移量。例如:
ActiveSupport::TimeZone[\"America/Los_Angeles\"]
=> (GMT-08:00) America/Los_Angeles
ActiveSupport::TimeZone[-8]
=> (GMT-08:00) America/Los_Angeles
但请记住,偏移量不等于时区,因为在任何一天中多个时区都可以在同一偏移量上。
,可接受答案的问题在于,不幸的是,它无法处理两个不同时区具有相同utc偏移量的情况。
例如-7可能是指两个不同的时区(“ America / Phoenix \”和“ America / Denver \”)的Arizona或Denver,因为Arizona不遵守夏令时。
ActiveSupport :: TimeZone [-7]仅返回这两个有效时区之一。
在稍微简化一点的美国邮政编码数据库中,包括一个UTC小时偏移量和Y / N字段(表明是否参与夏时制),我需要相同的功能,因此该数据库中的美国西海岸邮政编码都具有“ -8” \“和\” Y \“。
我找不到内置的Rails方法来执行此操作,因此我手动创建了一个查找哈希,其中的键是链接的UTC和DST字段,例如\“#{utc}#{dst} \”,其值为时区名称。此方法也适用于utc偏移量,例如\“ 5.5 \”(印度)。
在给查找方法提供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
...