在Ruby中设置时区偏移量

Jas*_*ett 23 ruby time

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

Dig*_*oss 34

设置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
Run Code Online (Sandbox Code Playgroud)

Ruby从主机的操作系统获取时区信息.

最直接的是,它使用C99和Posix指定的C库API.

该API的实现是特定于系统的,在我的Mac上,这意味着它将进行咨询,/etc/localtime除非有TZ环境变量.

它在Linux上大致相同.


fea*_*ool 30

更新的答案:使用ActiveSupport

最近发布的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
Run Code Online (Sandbox Code Playgroud)

PS:如果您想查看所有支持的时区名称,可以参考:

>> ActiveSupport::TimeZone::MAPPING
=> => {"International Date Line West"=>"Pacific/Midway", "Midway Island"=>"Pacific/Midway", ...}
Run Code Online (Sandbox Code Playgroud)

(原始答案 - 现在已经过时)

派对有点晚了,但发现我需要根据用户数据将时区设置为不同的值.

我以前做的是(但请参阅下面的更新):

def with_time_zone(tz_name)
  prev_tz = ENV['TZ']
  ENV['TZ'] = tz_name
  yield
ensure
  ENV['TZ'] = prev_tz
end
Run Code Online (Sandbox Code Playgroud)

这允许这样的事情:

>> 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
Run Code Online (Sandbox Code Playgroud)


jse*_*ars 12

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

ENV['TZ'] = 'UTC'
Time.at 0
#=> 1970-01-01 00:00:00 +0000
Run Code Online (Sandbox Code Playgroud)

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


Phr*_*ogz 7

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

  • 这很有效,但我的牙医预约迟到了两个小时。 (4认同)
  • 这个解决方案有效,但它不是非常便携.如果代码不共享此操作系统级别设置,则可能导致代码在不同计算机上的行为方式不同.您可能最好以编程方式覆盖时区,但这实际上取决于您的需求.绝对有将机器的时区设置为UTC的好处,例如在服务器上.但是,这意味着您的开发机器可能使用不同的时区,或者其他程序(例如电子邮件/日历客户端)将被迫使用UTC. (3认同)