在纯 Ruby 中获取时区(无 rails)

Getting timezone in pure Ruby (no rails)

我想知道我是否可以更改 Ruby 中的时区。我目前在 Asia/Kolkata (+0530)。

在我的系统中,如果我 运行:

>> puts (1935..1945).map { |x| "#{x} => #{Time.new(x).strftime('%z')}" }
1935 => +0530
1936 => +0530
1937 => +0530
1938 => +0530
1939 => +0530
1940 => +0530
1941 => +0530
1942 => +0630
1943 => +0630
1944 => +0630
1945 => +0630

如您所见,时区会根据历史事件发生变化。

我希望 Ruby(运行在任何地方的任何服务器上设置)在设置 Asia/Kolkata 或 IST 时显示 timzeone +0630。


但是,如果我 运行 此代码位于全球不同地区的 different system 上:

我回来了:

1935 => +0100
1936 => +0100
1937 => +0100
1938 => +0100
1939 => +0100
1940 => +0100
1941 => +0200
1942 => +0200
1943 => +0100
1944 => +0100
1945 => +0100

根据他们的时区,这可能是正确的。

现在,如果我试着回答这个问题 Change Time zone in pure ruby (not rails),答案是:

p Time.new(1942).utc.localtime("+05:30").strftime('%z')
=> "+0530"

我的要求打破了。因为 Asia/Kolkata 在 1942 年不是 +05:30。


如果我提到 IST:

p Time.new(1942).utc.+(Time.zone_offset('IST')).strftime('%z')
=> "+0000"

这个returns“+0000”。但我想要的输出是“+0630”。


现在 websites 可以让您做到这一点。因此,如果我输入“IST”,从技术上讲,在任何服务器上获得 +0630 并非不可能。


那么有没有办法通过提及时区 (IST) 来恢复 Ruby 中的时区?

For the time being, this works TZ=Asia/Kolkata ruby -e "p Time.new(1942).strftime('%z')"

设置 TZ 环境变量也适用于 Ruby:(参见 test_time_tz.rb

def with_tz(tz)
  old = ENV['TZ']
  ENV['TZ'] = tz
  yield
ensure
  ENV['TZ'] = old
end

with_tz('Asia/Kolkata') do
  (1935..1945).each do |x|
    puts "#{x} => #{Time.local(x).strftime('%z')}"
  end
end