如何在ruby中获得自己的TimeZone?

时间:2013-04-10 14:51:52

标签: ruby-on-rails ruby

寻找一种方法来获取我自己的时区,我可以在application.rb中传递给config.time_zone,以便在Rails中设置它。背景:我允许用户在yaml配置中指定他们的时区,但是如果没有设置,我想明确使用盒子的时区。我拥有来设置值,因为我将它用作转换时区以进行显示的参考 - 登录Rails应用程序的每个用户都可以设置他们的个人时区,我将为他们进行转换。

然而,在Ruby或Rails中似乎没有很好的API。 Time.now.zone返回3个字母的代码(例如EDT或CDT),但你不能传递它,因为它不够具体 - TZInfo类只接受“长”描述。

这就是我现在正在做的事情,这看起来非常糟糕:

time_zone = CONFIG[:time_zone] # set your local time zone here. use rake time:zones:local to choose a value, or use UTC.

unless time_zone
  # try to detect one

  if File.exists?('/etc/localtime')
    path = File.readlink('/etc/localtime')
    items = path.split("zoneinfo/")
    if items.length == 2
      time_zone = items[1]
    end
  end

  unless time_zone
    puts "*** Warning:  no time zone is set in config/config.yaml and could not detect system time. Using UTC as the default time; behavior may be unexpected."
    time_zone = "UTC"
  end
end

config.time_zone = time_zone

任何更好的想法家伙?

4 个答案:

答案 0 :(得分:2)

您可以尝试以下操作:

off_set = Time.now.gmt_offset
p ActiveSupport::TimeZone[off_set].name # "Atlantic Time (Canada)"

p ActiveSupport::TimeZone[off_set].tzinfo.name # "America/Halifax"

答案 1 :(得分:1)

为什么这不起作用的原因?:

Time.now.zone

编辑:

在获取区域之前,您可以Time.now.gmt_offset以秒为单位获得GMT偏移。之后,您可以Time.now.zone获取您的区号。

答案 2 :(得分:0)

由于3个字母的代码不够精确,请让用户从IANA time zone database指定全名。

然后你可以使用Time.zone = 'America/Halifax'(例如) Time.zone.name返回IANA名称,Time.zone.now返回指定时区的当前时间。

要以编程方式查找此格式的时区,您可以使用/etc/timezone(如果可用)。其他系统有其他方法(如果有一个方法可用)。

答案 3 :(得分:0)

如果您希望时区偏移小时,就像某些数据库一样(例如Postgres),则可以使用以下方法:

2.3.1 :063 > Time.zone.formatted_offset
"-07:00"

或者如果您需要以秒为单位的偏移量,则可以采用这种方法:

2.3.1 :059 > Time.zone.utc_offset
-25200