寻找一种方法来获取我自己的时区,我可以在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
任何更好的想法家伙?
答案 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