Ruby on rails 从偏移开始的Rails时区
看起来rails对时区有很好的支持,但是我遇到了一个我希望已经解决的需求,我只是在api中没有看到它 我希望能够根据偏移量找到时区。原因是我正在连接一个api,它将用户时区作为一个偏移量返回给我,我不想把这个偏移量重新变成Rails时区,这样应用程序的其余部分就可以正确地使用它Ruby on rails 从偏移开始的Rails时区,ruby-on-rails,timezone,Ruby On Rails,Timezone,看起来rails对时区有很好的支持,但是我遇到了一个我希望已经解决的需求,我只是在api中没有看到它 我希望能够根据偏移量找到时区。原因是我正在连接一个api,它将用户时区作为一个偏移量返回给我,我不想把这个偏移量重新变成Rails时区,这样应用程序的其余部分就可以正确地使用它 有什么建议吗?谢谢你的帮助 您可以使用ActiveSupport::timezone上的[]方法获取时区。您可以传递时区名称、小时偏移量或秒偏移量。例如: ActiveSupport::TimeZone["America
有什么建议吗?谢谢你的帮助 您可以使用
ActiveSupport::timezone
上的[]
方法获取时区。您可以传递时区名称、小时偏移量或秒偏移量。例如:
ActiveSupport::TimeZone["America/Los_Angeles"]
=> (GMT-08:00) America/Los_Angeles
ActiveSupport::TimeZone[-8]
=> (GMT-08:00) America/Los_Angeles
但请记住,偏移量并不等同于时区,因为多个时区在任何一天都可能处于同一偏移量上。公认答案的问题是,不幸的是,它不能处理两个不同时区具有相同utc偏移量的情况 例如-7可能指的是亚利桑那州或丹佛,这是两个不同的时区(“美国/凤凰城”和“美国/丹佛”),因为亚利桑那州不遵守夏令时
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
...
时区[-7]只返回这两个有效时区中的一个
在稍微简单一点的美国zipcodes数据库中,我需要相同的功能,该数据库包括UTC小时偏移量和Y/N字段,指示它是否参与夏令时,因此该数据库中的西海岸美国zipcodes都有“-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
...
令人惊叹的!正是我想要的。一位同事还提醒我,偏移量并不能将一对一映射到时区,尽管如此,因为我知道99.9%的用户都是我们,我认为从偏移量中做出有根据的猜测是值得的。谢谢谢谢结合使用时刻的时区:在某些情况下,这是错误的,无法找出原因,例如
Time.zone=ActiveSupport::timezone[-4]
然后Time.zone。现在
返回偏移量为-3的时间:(有任何帮助吗?似乎与Works> Time.Time=‘ET/GMT+8’< /代码> + 1个好问题有关。然而,另一个要考虑的因素是像亚利桑那州这样的情况,不遵循夏时制。要找到合适的美国区,您不仅要考虑偏移量,还要考虑DST是否被实现。这将更为复杂。他在美国以外的地方工作。