タイトル長いな。
Time.new の7つ目の引数には、UTC からのオフセットを表す文字列を指定できる。こんなふうに。
2.1.1 :001 > Time.new(2014, 11, 20, 21, 30, 0, "-06:00") => 2014-11-20 21:30:00 -0600
上の、”-06:00″が UTC からのオフセットを表す文字列だ。これをタイムゾーンの名前から得たい、というのが今回の趣旨。また ActiveSupport を使って書いた。
require 'active_support/time' def utc_offset_str(timezone) offset = Time.now.in_time_zone(timezone).utc_offset h = offset / (60 * 60) m = (offset - h * 60 * 60) / 60 f = h > 0 ? '+' : '-' sprintf("%s%02d:%02d", f, h.abs, m) end ['Asia/Tokyo', 'America/Chicago'].each do |zone| puts zone puts utc_offset_str(zone) end
Time#utc_offset で UTC からのオフセット(秒)が得られるので、それを使って目的の文字列を作っている。実行結果は次の通り。それにしてもベタなコードだなぁ。
takatoh@nightschool $ ruby utc_offset_str.rb Asia/Tokyo +09:00 America/Chicago -06:00
おまけ。タイムゾーン名の一覧は↓ここで発見した。
cf. タイムゾーンの一覧
さらにおまけ。
ActiveSupport の in_time_zone って ‘Asia/Tokyo’ じゃなくてただの ‘Tokyo’ でも受け付けるくせに ‘JST’ だとエラーになる。
2.1.1 :001 > require 'active_support/time' => true 2.1.1 :002 > Time.now.in_time_zone('Tokyo') => Thu, 20 Nov 2014 21:44:24 JST +09:00 2.1.1 :003 > Time.now.in_time_zone('JST') ArgumentError: Invalid Timezone: JST from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active_support/core_ext/time/zones.rb:71:in `rescue in find_zone!' from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active_support/core_ext/time/zones.rb:55:in `find_zone!' from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active_support/core_ext/date_and_time/zones.rb:20:in `in_time_zone' from (irb):3 from /home/takatoh/.rvm/rubies/ruby-2.1.1/bin/irb:11:in `<main>'