在 Ruby 中设置时区偏移量

30

在Ruby中,默认的时区偏移量似乎是-0800。我想将我的设定为-0500。我该怎么做?


3
修改操作系统的时区。 - Phrogz
可以的。如果你把那个作为答案,我会接受它。 - Jason Swett
3
请更改Ruby的TZ变量。它是由主机操作系统设置的。使用TZ=EST将您的时区设置为-05:00。 - Andrew Hendrie
值得注意的是,由于“夏令时”的灾难,选择指定“EST”和任何类似的“ST”和“DT”值是一个非常糟糕的想法。EST确实总是表示-05:00,但它在一年中约有7个月的时间不是该地区的正确时区。设置此值时,始终使用地理名称:“America/New_York”或“America/Los_Angeles”效果很好。有关详尽的规范列表,请参见:https://github.com/tzinfo/tzinfo-data/tree/master/lib/tzinfo/data/definitions - XP84
4个回答

41

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


这是可用时区的列表 https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html - stopanko

36

更新的答案:使用ActiveSupport

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", ...}

(original answer -- now outdated)

有一点晚了,但我发现根据用户数据需要设置不同的时区。

我以前所做的是(但请查看下面的更新):

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

15

要在程序中设置ruby时区,还需通过访问ENV哈希在Ruby内设置环境变量:

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

这有助于避免仅为了一个应用而修改您的操作系统,并且如果您将应用程序移动到另一台计算机,可以更好地实现应用程序的可移植性。如果您正在使用Rails,则ActiveSupport :: TimeZone还提供一些功能以帮助覆盖时区。


6

更改操作系统的时区;Ruby会自动获取这些更改。


4
这个解决方案可行,但是不是非常便携。如果不共享此操作系统级别设置,则可能导致代码在不同的计算机上表现不同。你可以考虑通过编程方式覆盖时区,但这确实取决于你的需求。有些情况下,将机器的时区设置为UTC是很好的选择,例如在服务器上。然而,这意味着你的开发机器可能使用不同的时区,或者其他程序(如电子邮件/日历客户端)将被强制使用UTC。 - jsears
4
那很有效,但我晚了两个小时去看牙医。 - Cary Swoveland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接