Rails时区偏移和dst

时间:2011-10-23 23:32:26

标签: ruby-on-rails timezone

我正在寻找一些帮助,如何在Rails中存储正确的时区,从提供UTC偏移的数据和DST。

数据来自http://openflights.org/data.html

时区小时偏离UTC。小数小时表示为小数,例如。印度是5.5。

DST 夏令时。 E(欧洲),A(美国/加拿大),S(南美洲),O(澳大利亚),Z(新西兰),N(无)或U(未知)之一。

我想知道如何在Rails中使用这些数据将这些机场的时区存储为Rails可识别的时区列中的字符串。

2 个答案:

答案 0 :(得分:0)

除非您创建DST和偏移到特定时区的自定义映射,否则我认为没有解决方案。

我最终使用geonames.org网络服务,根据纬度/经度找出时区。

答案 1 :(得分:0)

我在美国邮政编码数据库的稍微简单的情况下需要相同的功能,其中包括UTC小时偏移量和Y / N字段,表明它是否参与夏令时,因此此数据库中的West Coast USA zipcodes都具有& #34; -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
...