在Ruby中设置时区偏移量

Ruby中的默认时区偏移量显然是-0800。 我想把我的设置为-0500。 我该怎么做呢?

更改操作系统的时区; Ruby将接受改变。

设置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上大致相同。

更新的答案:使用ActiveSupport

最近发布的Rails的ActiveSupport模块在active_support / time模块中提供了更好的解决方案。 (注意,可以在不拖动所有Rails的情况下加载ActiveSupport中的模块……)

我推荐这种方法,因为它不需要设置任何全局状态(例如在OS上设置时区或修改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 

要以编程方式设置ruby时区,还可以通过访问ENV哈希来设置ruby中的环境变量:

 ENV['TZ'] = 'UTC' Time.at 0 #=> 1970-01-01 00:00:00 +0000 

这有助于避免仅为应用程序修改操作系统的需要,并且如果将应用程序移动到其他计算机,则可以为应用程序提供更多可移植性。 如果您正在使用Rails, ActiveSupport :: TimeZone还提供了一些function来帮助覆盖TimeZone。