Ruby中的默认时区偏移量显然是-0800。我想把我的设置为-0500。我该怎么做?
答案 0 :(得分:32)
设置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上大致相同。
答案 1 :(得分:29)
最近发布的Rails的ActiveSupport模块在active_support / time模块中提供了更好的解决方案。 (请注意,可以在不拖动所有Rails的情况下加载ActiveSupport中的模块...)
我推荐这种方法,因为它不需要设置任何可能在其他地方产生意外副作用的全局状态(例如,在操作系统上设置时区或修改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
PS:如果您想查看所有支持的时区名称,可以参考:
>> 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
答案 2 :(得分:11)
要以编程方式设置ruby时区,还可以通过访问ENV哈希来设置ruby中的环境变量:
int index = Array.IndexOf(stringArray, randChar);
if(index > -1){
stringArray[index] = "_";
}
这有助于避免仅针对应用修改操作系统的需要,并且如果您将应用移动到其他计算机,则可以为您提供更多的便携性。如果您正在使用Rails,ActiveSupport::TimeZone还提供了一些功能来帮助覆盖TimeZone。
答案 3 :(得分:6)
更改操作系统的时区; Ruby将接受改变。