Rubyでタイムゾーンの名前から、UTCからのオフセットを表す文字列を得る

タイトル長いな。

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>'

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください