- blogs:
- cles::blog

日付のGMT変換にハマる

Rubyには日付を扱うクラスとして、TimeとDateTimeという2つのクラスがあります。TimeはSQLの型のように日付は格納できないように見えますが、どちらも日付と時刻が格納できます。おそらく何らかの歴史的な経緯があって、結果としてこうなっているんだとは思いますが、実はその違いが良くわかっていません。time_tとstruct tmの違いみたいなものでしょうか。
ただ、これらのクラスはタイムゾーンの扱いがちょっと違うようで、時刻をGMT変換しようとしたらハマってしまいました。
おそらくシステムの設定に依存するとはおもいますが、上記を見ると分かるとおり、僕の環境では日付にタイムゾーンがついていないとDateTimeは日時をUTCとしてとらえており、Timeはローカル時としてとらえているようです。タイムゾーンがついていない場合にはローカル時として扱ってくれると言う意味では、Timeを常用するのが安全なんですかね。
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3214
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
日付にタイムゾーンがついていないとDateTimeは日時をUTCとしてとらえており、Timeはローカル時としてとらえているようです。タイムゾーンがついていない場合にはローカル時として扱ってくれると言う意味では、Timeを常用するのが安全なんですかね。
タイムゾーン付きでないISO8601もどき形式をISO8601としてちゃんと解釈しているのがDateTime.parse(が呼ぶParseDate.parse)、単にTとかZとか知らん文字を読み飛ばして適当に時間作るのがTime.parse、ということなのではないでしょうかね。
ISO8601はタイムゾーン必須なのですか?それは認識していませんでした。
ちなみにTime.parseはタイムゾーンをきちんと認識しているようですよ。
Time.parse('2009-09-21T00:00:00Z').gmtime.iso8601 # => "2009-09-21T00:00:00Z"
Time.parse('2009-09-21T00:00:00+0900').gmtime.iso8601 # => "2009-09-20T15:00:00Z"
Rubyのドキュメントにこれらの挙動の違いが記載されていないことが問題だと思うんですよね。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110778)
3 . 年次の人間ドックへ(110372)
4 . 2023 年分の確定申告完了!(1つめ)(109918)
5 . 三菱鉛筆がラミーを買収(109819)