時刻や日付を扱うメソッドの基本情報まとめ【Ruby】【Rails】

MEMO

本記事はメモ記事ですので修正・加筆する可能性が高いです。
ご了承下さい。

自分も勉強しながらなので記事はちょっとずつ整っていく予定です。


私の環境

環境

  • Windows Subsystem for Linux (Ubuntu 18.04)
  • Rails 5.2.0
  • Ruby 2.5.3

超基本事項

とりあえずこれは知ってないとマズいという事項を。
普段、そんなにいろいろ暗記する必要はないと思う、とは言っていますがこれくらいは暗記必須ですね。

Timeクラス

『今』の情報がほしければ『Time.now』。これは覚えておきましょう。
『Time.current』でも今の情報が取れますがnowとは参照するタイムゾーンが異なります(タイムゾーンに関しては後述)。

特定の日時オブジェクトがほしければ『Time.new』に年、月、日、時、分、秒の順に引数を指定すればOKです。

Dateクラス

『今日』という情報がほしければ『Date.today』。必須ですが覚えやすいですよね。
これに関しても『Date.current』でTimeと同じようにapplication.rbの設定を参照する『今日』が取得できます。

こちらも『Date.new』に年、月、日の引数を指定すればOKです。

DateTimeクラス

Dateクラスのサブクラスで時間情報も扱えるようになったもの。

時間情報があるので『DateTime.now』で今の情報が取れます。
これも『DateTime.current』は先の2つと同様です。

ここで『Timeクラスとどう違うのか』という疑問が生まれますが、多少の違いはあれど大きな差はなく『基本的にTimeクラスを使っておけばいい』らしいので、今回は難しいことを考えずDateTimeクラスはおいておくことにします。

タイムゾーンについて

タイムゾーン(TZ)という概念を知っておかなくてはいけません。

要は『時差』を考慮する方法のことですね。

コンピュータの世界では標準をUTC (協定世界時:Coordinated Universal Time)としています。これは日本よりも9時間遅い時刻、つまりUTCからみるとJST (日本標準時:Japan Standard Time) は9時間進んでいると表現することができます。

先程Time.nowで得られたオブジェクトに書かれていた2019-02-25 21:03:19 +0900の後ろについている『+0900』というのがそれを表しています(おそらく +09時間00分という意味)。

これはどこの設定を見ているかと言うと、次のようになっています。

素のRubyの場合

優先されるのは環境変数TZの値。これが設定されていなければシステム (OS)の設定が利用されるようです。

というわけで.bash_profileなどにexport TZ="Asia/Tokyo"とか書いてsourceしておけばOKです。
(タイムゾーンの設定用IDに関してはこちらに書いてありました)

Railsの場合

config/application.rbに設定を書いておくことができます。

上にも少し書きましたが、『Time.now』『Date.today』『DateTime.now』は環境変数またはシステムのタイムゾーン設定を、『Time.current』などのcurrentapplication.rbに設定したタイムゾーン設定が利用されます。
つまりこれらを同じにしている場合はnowもcurrentも値は同じ、みたいなことになります。

各クラスのメソッド

Timeクラス

とりあえず調べたのをひたすらまとめておきますが、もちろん全部覚える必要はないので使いやすくて覚えやすい書き方をおさえておけばいいと思います。

次の○曜日、前の○曜日を取得するnext_occurring, prev_occurring はRails5.2から追加されたメソッドらしいので、現時点では新しいRailsを利用していないと使えないと思います。

単数形と複数形について

dayとdays, monthとmonths, yearとyears のような単数形、複数形はどちらを用いても同じです(aliasとなるよう設定されています)。

まぁそれでも間違えていると気持ち悪いので数字に合わせて単数か複数かは適切に使用したいですね。

Dateクラス

基本的にTimeクラスのオブジェクトに使えたメソッドが同じように使えますので重複しているものは省略します。

ただしこちらは時間情報を持っていないので、時分秒を取得するメソッドなどはエラーとなります。

時間の減算はエラーになりませんでした。
1時間引いて23時になったので、おそらく0時という情報を持ってはいるのでしょう。というか加算・減算をすると時間情報が姿を表すようですね。
ちなみに

もともとはもちろんDateクラスなのですが、減算して時間情報をもたせるとTimeWithZoneというクラスに変わっていました。やっぱりDateクラスは時間情報を持てないんですね。
TimeWithZoneについては後述します。

DateTimeクラス

さて、あまり使わなくていい気がするDateTimeクラスですが、ちょっと変わったところがあります。

nowやcurrentでインスタンスを生んだときはTimeやDateと同じようなタイムゾーンになりますが、newで生むと必ずUTCで生まれるようです。
これに対してTimeクラスにnewしたときはシステムのタイムゾーン設定依存ですので異なります。

TimeWithZoneクラスに関して

TimeWithZoneクラスとは?

日付と時間情報を扱えるクラスです。Rails独自のクラスでTimeクラスと完全な互換性をもっています。親はObjectクラスで、Timeクラスを継承しているわけではありません。
まぁTimeクラスと大きな差はなさそうなので親戚くらいの認識でいいのでしょうか。

currentメソッドやzone.nowメソッドを使うとTimeWithZoneクラスになるようです。
また、さきほどのようにDateクラスのオブジェクトから1時間引いてみたり、.agoメソッドなどを使うとTimeWithZoneクラスになりました。

よく見るとタイムゾーンがHSTになっているのが分かりますね。今回はわかりやすくするためにapplication.rbのタイムゾーン設定をHSTにしておきました。
TimeWithZoneクラスはapplication.rbのタイムゾーン設定が利用されます。
currentメソッドを使うとapplication.rbのタイムゾーンが利用される、と前述しましたが、これはTimeWithZoneクラスになっていたからなんですね。

Timeクラスと大差ないとは思いますが、Timeクラスのタイムゾーンは環境変数(システム)依存、TimeWithZoneクラスのタイムゾーンはapplication.rb依存というのは覚えておくと良さそうですね。

メソッドのエイリアスについて

.month.monthsはエイリアスになっているということは前述しましたが、次のようなものが設定されているようです。

 


追記予定:strftime, strptime, time_formats


 

参考サイト

コメントを残す

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

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