大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【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.newDateTime.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

上記のTimeDateTimeを見てみると、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_daybeginning_of_yearなどです。本当に直感的ですよねww

また機会があれば他のメソッドも紹介していきたいと思います!

以上!大ちゃんの駆け出し技術ブログでした!