所以看起来rails对时区有很好的支持,但我遇到了一个要求,我希望已经解决了,我只是没有在api中看到它。
我希望能够根据偏移量找到TimeZone。原因是我正在连接到api,这使得我将用户时区作为偏移量返回,并且不希望重新发明轮子将该偏移量转换为Rails TimeZone,以便应用程序的其余部分可以正确使用它。
有什么建议吗?谢谢你的帮助!
答案 0 :(得分:39)
您可以使用[]
上的ActiveSupport::TimeZone
方法获取时区。您可以传递时区名称,小时偏移量或第二个偏移量。例如:
ActiveSupport::TimeZone["America/Los_Angeles"]
=> (GMT-08:00) America/Los_Angeles
ActiveSupport::TimeZone[-8]
=> (GMT-08:00) America/Los_Angeles
但请记住,偏移量不等于时区,因为任何一天多个时区都可以在同一偏移量上。
答案 1 :(得分:0)
接受答案的问题是,遗憾的是它不处理两个不同时区具有相同utc偏移的情况。
例如-7可能指的是亚利桑那州或丹佛,它们是两个不同的时区(“America / Phoenix”和“America / Denver”),因为亚利桑那州没有观察夏令时。
ActiveSupport :: TimeZone [-7]仅返回这两个有效时区中的一个。
我在美国邮政编码数据库的稍微简单的情况下需要相同的功能,其中包括UTC小时偏移和Y / N字段,表明它是否参与夏令时,因此该数据库中的West Coast USA邮政编码都具有“ -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
...