0

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

但是,在 Ruby 或 Rails 中似乎没有很好的 API 来执行此操作。Time.now.zone 返回 3 个字母的代码(例如 EDT 或 CDT),但您不能传递它,因为它不够具体—— TZInfo 类将只接受“长”描述。

这就是我现在正在做的事情,这看起来很hacky:

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

4 回答 4

3

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

Time.now.zone

编辑:

在获得区域之前,您可以Time.now.gmt_offset在几秒钟内获得您的 GMT 偏移量。之后,您可以Time.now.zone获取您的区号。

于 2013-04-10T14:53:32.850 回答
3

您可以尝试以下方法:

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

或者

p ActiveSupport::TimeZone[off_set].tzinfo.name # "America/Halifax"
于 2013-04-10T15:20:12.010 回答
0

由于 3 字母代码不够精确,请让用户从IANA 时区数据库中指定全名。

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

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

于 2016-05-03T16:25:12.490 回答
0

如果您想要以小时为单位的时区偏移量,就像某些数据库(如 Postgres)那样,您可以使用以下方法:

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

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

2.3.1 :059 > Time.zone.utc_offset
-25200
于 2019-10-28T02:00:14.010 回答