在Ruby中,默认的时区偏移量似乎是-0800。我想将我的设定为-0500。我该怎么做?
在Ruby中,默认的时区偏移量似乎是-0800。我想将我的设定为-0500。我该怎么做?
设置 TZ 环境变量...
$ ruby -e 'puts Time.now'
Sat Jan 15 20:49:10 -0800 2011
$ TZ=UTC ruby -e 'puts Time.now'
Sun Jan 16 04:49:20 +0000 2011
Ruby从主机的操作系统获取时区信息。
最直接的方式是使用由C99和Posix指定的C库API。
该API的实现是特定于系统的,在我的Mac上,它会查看/etc/localtime
,除非存在TZ环境变量。
在Linux上也大致相同。
Rails的ActiveSupport模块的较新版本在active_support/time模块中提供了一个更好的解决方案。(请注意,ActiveSupport中的模块可以在不加载所有Rails的情况下加载...)
我推荐这种方法,因为它不需要设置任何全局状态(例如在操作系统上设置时区或修改ENV['TZ']
),这可能会在其他地方产生意想不到的副作用。以下是使用方法:
>> require 'active_support/time'
=> true
>> Time.at(1000000000).in_time_zone('US/Eastern')
=> Sat, 08 Sep 2001 21:46:40 EDT -04:00
>> Time.at(1000000000).in_time_zone('US/Pacific')
=> Sat, 08 Sep 2001 18:46:40 PDT -07:00
提示:如果您想查看支持的所有时区名称,您可以参考以下链接:
>> ActiveSupport::TimeZone::MAPPING
=> => {"International Date Line West"=>"Pacific/Midway", "Midway Island"=>"Pacific/Midway", ...}
有一点晚了,但我发现根据用户数据需要设置不同的时区。
我以前所做的是(但请查看下面的更新):
def with_time_zone(tz_name)
prev_tz = ENV['TZ']
ENV['TZ'] = tz_name
yield
ensure
ENV['TZ'] = prev_tz
end
这样的许可使得以下功能成为可能:
>> with_time_zone('US/Eastern') { puts Time.at(1000000000) }
2001-09-08 21:46:40 -0400
>> with_time_zone('US/Pacific') { puts Time.at(1000000000) }
2001-09-08 18:46:40 -0700
要在程序中设置ruby时区,还需通过访问ENV哈希在Ruby内设置环境变量:
ENV['TZ'] = 'UTC'
Time.at 0
#=> 1970-01-01 00:00:00 +0000
这有助于避免仅为了一个应用而修改您的操作系统,并且如果您将应用程序移动到另一台计算机,可以更好地实现应用程序的可移植性。如果您正在使用Rails,则ActiveSupport :: TimeZone还提供一些功能以帮助覆盖时区。
更改操作系统的时区;Ruby会自动获取这些更改。