Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从偏移开始的Rails时区_Ruby On Rails_Timezone - Fatal编程技术网

Ruby on rails 从偏移开始的Rails时区

Ruby on rails 从偏移开始的Rails时区,ruby-on-rails,timezone,Ruby On Rails,Timezone,看起来rails对时区有很好的支持,但是我遇到了一个我希望已经解决的需求,我只是在api中没有看到它 我希望能够根据偏移量找到时区。原因是我正在连接一个api,它将用户时区作为一个偏移量返回给我,我不想把这个偏移量重新变成Rails时区,这样应用程序的其余部分就可以正确地使用它 有什么建议吗?谢谢你的帮助 您可以使用ActiveSupport::timezone上的[]方法获取时区。您可以传递时区名称、小时偏移量或秒偏移量。例如: ActiveSupport::TimeZone["America

看起来rails对时区有很好的支持,但是我遇到了一个我希望已经解决的需求,我只是在api中没有看到它

我希望能够根据偏移量找到时区。原因是我正在连接一个api,它将用户时区作为一个偏移量返回给我,我不想把这个偏移量重新变成Rails时区,这样应用程序的其余部分就可以正确地使用它


有什么建议吗?谢谢你的帮助

您可以使用
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是否被实现。这将更为复杂。他在美国以外的地方工作。