RubyでUTC(協定世界時)のデータをJST(日本標準時)に変換したいとき。

in_time_zone('Tokyo')というメソッドを使えば変換できます。

たとえば、APIで受け取ったデータの中に時刻データが入っていて、そのままだとUTCのデータだから日本基準としては9時間遅れているように、見えてしまいます。

APIで時刻のデータを受け取ると、文字列になってしまっているので、strptimeで時刻形式に変換、あとはin_time_zone('Tokyo')をしてあげればOKです。

以下のように、2021-09-10T09:58:35Zの時刻情報がJSTで2021年9月10日の18時58分になりました!

[1] pry(main)> Time.strptime('2021-09-10T09:58:35Z', '%Y-%m-%dT%H:%M:%S%Z').in_time_zone('Tokyo')
=> Fri, 10 Sep 2021 18:58:35.000000000 JST +09:00

ちなみに余談ですが、UTCから何時間ずれているのか、時差の情報はTime.current.utc_offsetで取得が可能です。

以下のように日本がlocaleだと、32400秒 = 32400 / 60 / 60 で9時間ですね。

[1] pry(main)> Time.current.utc_offset
=> 32400

これは、時刻型に足し算もできます。

ただし、これだとあくまでもUTCのままなので、このやり方で時差の調整はやらないほうがいいでしょう。

[1] pry(main)> Time.strptime('2021-09-10T09:58:35Z', '%Y-%m-%dT%H:%M:%S%Z') + Time.current.utc_offset
=> 2021-09-10 18:58:35 UTC

この記事の環境情報

  • Ruby 3.1.2