我可以用Ruby覆盖系统时区吗?

我可以用Ruby覆盖系统时区吗?,ruby,timezone,environment-variables,Ruby,Timezone,Environment Variables,我在Ubuntu 12.04上看到: $ cat /etc/timezone America/Phoenix 因此,Time将返回非UTC区域的时间: $ irb > Time.now => 2013-03-27 13:44:49 -0700 > Time.at 0 => 1969-12-31 17:00:00 -0700 我可以使用TZ环境变量覆盖系统时区: $ TZ=UTC irb > Time.now => 2013-03-27 20:47:19

我在Ubuntu 12.04上看到:

$ cat /etc/timezone 
America/Phoenix
因此,
Time
将返回非UTC区域的时间:

$ irb
> Time.now
=> 2013-03-27 13:44:49 -0700
> Time.at 0
=> 1969-12-31 17:00:00 -0700
我可以使用
TZ
环境变量覆盖系统时区:

$ TZ=UTC irb
> Time.now
=> 2013-03-27 20:47:19 +0000
> Time.at 0
=> 1970-01-01 00:00:00 +0000
我是否可以在Ruby进程中以编程方式进行此更改?

您可以使用
Time\gmtime
。比如说

Time.now
# => Wed Mar 27 16:55:11 -0400 2013 
Time.now.gmtime
# => Wed Mar 27 20:55:14 UTC 2013 
Time.at(0)
# => Wed Dec 31 19:00:00 -0500 1969 
Time.at(0).gmtime
# => Thu Jan 01 00:00:00 UTC 1970 

Time#utc
也可以工作,是
Time#gmtime
的别名。您还可以通过访问
ENV
散列,从ruby中设置环境变量:

ENV['TZ'] = 'UTC'
Time.at 0
#=> 1970-01-01 00:00:00 +0000
也可以看到这个答案:,它提供了一种写类似

with_time_zone 'UTC' do
  # do stuff
end

# now TZ is reset to system standard

根据用例的不同,ActiveSupport提供了许多与时区相关的功能

$ gem install activesupport
$ irb
> require 'active_support/time'            # => true
> Time.zone = 'Pacific Time (US & Canada)' # => "Pacific Time (US & Canada)"
> Time.zone.now                            # => Wed, 27 Mar 2013 16:14:19 PDT -07:00

ActiveSupport可能是一个比您想要的更大的依赖项,但您不应该忽视它。

您的问题相当模糊。不要高估某些上下文提供的帮助。这对于了解如何获取基于UTC的时间非常有用,但当所需时区不是UTC时,这没有帮助。