【Rails】日付や時刻を扱うRubyのクラス
はじめに
こんにちは!大ちゃんの駆け出し技術ブログです。
今回は日付、時刻を扱うRubyのクラスについて紹介したいと思います。
早速説明に入ります。皆さんは日付や時刻を表すRubyのクラスを知っていますか。
日付や時刻を表すクラスとして、Rubyの標準ライブラリには以下の3つが定義されています。
Time
クラスDate
クラスDateTime
クラス
Date
クラスは日付を扱うクラスで、Time
クラスとDateTime
クラスは日付と時刻を扱うクラスです。
(引用: プロを目指す人のためのRuby入門-言語仕様からテスト駆動開発・デバッグ技法まで)
今回は3つのクラスの違いにたまに触れつつ、日付に関わるクラスの使用方法や使えるメソッドなどについて紹介をしていきます。
準備としてテキトーなアプリケーションでコンソールを起動してください。いろいろな入力をしていくので、念のため変更内容が反映されないようオプションに--sandbox
をつけておきましょう。(もしくはirb
でもいいと思います)
$ rails c --sandbox
現在時刻を取り出す
まずは簡単に現在時刻をクラスメソッドを使用して出力してみましょう。
Time.new => 2021-01-27 08:33:49 +0900
2021-01-27
の部分は本日の日付を表しており、08:33:49
の部分は現在時刻です。では+0900
とはなんでしょうか。察しの良い方はわかると思いますが、これは日本標準時と協定世界時の時差を表しています。つまり、協定世界時より9時間先に進んでいるということになります。
ここでDate.new
とDateTime.new
を入力すると少し違う形で出力されます。
Date.new => Mon, 01 Jan -4712 DateTime.new => Mon, 01 Jan -4712 00:00:00 +0000
上述したように、Date
は日付を扱いとDateTime
は日付と時刻を扱います。よってその違いは時刻の有無となります。
Mon, 01 Jan
(つまり、1/1(月))とあるように、現在時刻を出力してくれないのです。これは暦日付に相当する日付オブジェクトを生成しているためです。暦日付について詳しくは説明しませんが、要は時間の出力方法が違うということですね。
Date
クラスを使って現在時刻を出力するにはtoday
メソッドを使います。DateTime
クラスの場合はnow
メソッドを使います。(Time
クラスもnow
メソッドを使用すれば現在時刻を出力できます!出力結果はTime.new
と同じになります。Time
が付けばnow
と覚えておきましょう。)
Date.today => Wed, 27 Jan 2021 DateTime.now => Wed, 27 Jan 2021 10:18:01 +0900
特定の時刻を出力
現在時刻ではなく特定の時刻を引数を与えることで出力することができます。
例えば去年のクリスマスの日付を取り出したいのであれば、Date.new
に対して2020, 12, 24引数として指定します。
Date.new(2020, 12, 24) => Fri, 24 Dec 2020
遊びの待ち合わせ時刻も出力したいのであればTime
もしくはDateTime
を使用します。
Time.new(2020,12,24,11, 0, 0) => 2020-12-24 11:00:00 +0900 DateTime.new(2020,12,24,11, 0, 0) => Thu, 24 Dec 2020 11:00:00 +0000
上記のTime
とDateTime
を見てみると、2つの違いがわかると思います。
DateTime
の方はThu
とあるようにその日の曜日も出力しています。また、+0000
から日本標準時ではなく世界標準時を出力しています。
あともう1つ。引数を渡さなければデフォルト値が出力されます。例えば、Time.new(2020,12,24,11, 0, 0)
の0の部分はデフォルト値ですので、Time.new(2020,12,24,11)
で同じ値が出力できます。
Time.new(2020,12,24,11) => 2020-12-24 11:00:00 +0900
クラスの型の変更
上記でTime
クラスとDateTime
クラスの違いを上述しましたが、Time
クラスのからDateTime
クラスの出力に変更することもできます。Time
クラスの出力にto_datetime
メソッドを使用します。
Time.new(2020,12,24,11).to_datetime => Thu, 24 Dec 2020 11:00:00 +0900
to_datetime
メソッドがあるということは、、、
そうです。to_date
メソッドもto_time
メソッドもあります。
Time.new(2020,12,24,11).to_datetime.to_date => Thu, 24 Dec 2020 Time.new(2020,12,24,11).to_datetime.to_date.to_time => 2020-12-24 00:00:00 +0900
日付・時刻の各要素を出力
次は年・月・日のように日付や時刻を表している各要素を出力する方法を紹介します。と言ってもめちゃくちゃシンプルな方法です。なんと、year
メソッド、month
メソッドなどが標準で定義されています。さすがRuby。
xmas_time = Time.new(2020,12,24,11) => 2020-12-24 11:00:00 +0900 xmas_time.year => 2020 # 年 xmas_time.month => 12 # 月 xmas_time.day => 24 # 日 xmas_time.hour => 11 # 時 xmas_time.min => 0 # 分 xmas_time.sec => 0 # 秒
strftimeメソッド
今までの日付・時刻の出力(2020-12-24 11:00:00 +0900
など)は見た目で何を表しているのかがわかりますが、「2020/12/24」と出力したいとします。
そんな時に便利なメソッドがstrftimeメソッドです。引数に出力したいフォーマットを指定します。
Time.new(2020,12,24,11).strftime("%Y/%m/%d") => "2020/12/24"
フォーマットの引数を見ると少し複雑ですが覚える必要はありません。公式リファレンスを参照すれば出力したいフォーマットに合わせた引数をリストとして載せているのでそちらを参照すれば大丈夫です。下記は公式の使い勝手が良さそうなフォーマットの例になります。
t = Time.new(2001,2,3,4,5,6,"+09:00") p t.strftime("%Y%m%d") # => 20010203 p t.strftime("%F") # => 2001-02-03 p t.strftime("%T") # => 04:05:06
まだまだあります!
今回紹介した以外にもまだまだたくさんのメソッドによる出力方法があります。
例えば、end_of_day
やbeginning_of_year
などです。本当に直感的ですよねww
また機会があれば他のメソッドも紹介していきたいと思います!
以上!大ちゃんの駆け出し技術ブログでした!