【Ruby入門】日付・時刻を扱ってみよう(覚えておくべき基本知識を網羅)

アプリケーション開発を行うときに、ユーザーの登録日時を登録したり、商品が買われた時間を保存したりするなど、日付や時刻を扱う場面が出てきます。

ここでは Ruby で日付・時刻を扱う基本的な方法を学んでいきましょう。

 

目次

日付・時刻を扱っているクラスの種類

Ruby には3種類の日付・時刻を扱うクラスがあります。

Timeクラス よく使う 日付と時刻
Dateクラス よく使う 日付
DateTimeクラス 日付と時刻
メモ

クラスについて詳しくはこちらに書きました(作成中)。

 

以下からそれぞれのクラスについて詳しく解説していきます。

 

Timeクラスの使い方

日付と時刻を扱う Timeクラスの使い方を解説します。

 

今の日時を取得する

今の日時を取得したい場合は、now メソッドを使います。

プログラム

p Time.now

実行結果

2019-04-09 07:39:55 +0000

 

new メソッドでも同様の結果が得られます。

プログラム

p Time.new

実行結果

2019-04-09 07:39:55 +0000

 

指定した日時のオブジェクトを作成する

指定した日時のオブジェクトを作成する場合は、local メソッドを使います。

プログラム

p Time.local(2019, 4, 9, 7, 39, 55)

実行結果

2019-04-09 07:39:55 +0000

 

プログラム

p Time.local(2019, 4, 9)

実行結果

2019-04-09 00:00:00 +0000

 

文字列をTimeオブジェクトに変換する

文字列をTimeオブジェクトに変換する場合は、parse メソッドを使います。

プログラム

require "time"
p Time.parse("2019/01/01 12:15:30")

実行結果

2019-01-01 12:15:30 +0000

 

ほかにもさまざまなフォーマットに対応しています。

プログラム

require "time"
p Time.parse("20190101121530")

実行結果

2019-01-01 12:15:30 +0000

 

プログラム

require "time"
p Time.parse("2019-1-1")

実行結果

2019-01-01 00:00:00 +0000

 

Timeオブジェクトを文字列に変換する

Timeオブジェクトを文字列に変換する場合は、strftime メソッドを使います。%Y%m などの書式を指定することで、そこに対応する要素が表示されます。

プログラム

t = Time.now
p t.strftime("現在時刻は%Y年%m月%d日%H時%M分%S秒です。")

実行結果

"現在時刻は2019年04月10日08時17分48秒です。"

 

よく使う書式一覧

書式 用途 出力例
%Y 西暦 2020
%y 西暦の下2桁 20
%m 0112
%d 0131
%H 時(24時間制) 0023
%l 時(12時間制) 0112
%M 0059
%S 006060 はうるう秒)
%A 曜日 Sunday, Monday
%a 曜日の省略形 Sun, Mon
%w 日曜日を起点(0)とした曜日の数 06
%B 月の名称 January, February
%p 午前または午後 AM, PM
%Z タイムゾーン UTC

 

日付や時刻の一部分を取得する

日付や時刻の一部分を取得したい場合は、year や month、day メソッドなどが用意されています。

プログラム

t = Time.now
p t.year # 年
p t.month # 月
p t.day # 日

実行結果

2019
4
9

 

日付・時刻の要素を取得するメソッド一覧

year
month
day
hour
min
sec
yday 1月1日からの通算日
wday 日曜日を起点(0)とした数

  • 0: 日曜日
  • 1: 月曜日
  • 2: 火曜日
  • 3: 水曜日
  • 4: 木曜日
  • 5: 金曜日
  • 6: 土曜日
zone タイムゾーンを表す文字列(例: UTC

 

日時を加減算する

Time オブジェクトに数値を足したり引いたりすることができます。1ごとに1秒が加算・減算されます。

プログラム

t = Time.now
p t
p t + 1
p t - 1

実行結果

2019-04-10 03:56:14 +0000
2019-04-10 03:56:15 +0000
2019-04-10 03:56:13 +0000

 

以下のように、Time オブジェクト同士の差を秒数で取得することもできます。

プログラム

t1 = Time.local(2020, 1, 1, 0, 0, 0)
t2 = Time.local(2020, 1, 1, 0, 0, 30)
p t2-t1

実行結果

30.0

 

日時を比較する

Time オブジェクト同士で比較することができます。

プログラム

t1 = Time.local(2019, 1, 1, 0, 0, 0)
t2 = Time.local(2019, 1, 2, 0, 0, 0)

p t1 > t2
p t1 <= t2
p t1 == t2

実行結果

false
true
false
メモ

>, <=, == などの使い方について詳しくは、以降のこちらの記事に書きました(作成中)。

 

Dateクラスの使い方

日付を扱う Dateクラスの使い方を解説します。

ポイント

Dateクラスを使う際には、あらかじめ以下のコードを追加しておく必要があります。

require "date"

 

今日の日付を取得する

今日の日付を取得したい場合は、today メソッドを使います。

プログラム

require "date"
p Date.today

実行結果

#<Date: 2019-04-11 ((2458585j,0s,0n),+0s,2299161j)>

 

指定した日付のオブジェクトを作成する

指定した日付のオブジェクトを作成する場合は、new メソッドを使います。

プログラム

require "date"
p Date.new(2020, 1, 1)

実行結果

#<Date: 2020-01-01 ((2458850j,0s,0n),+0s,2299161j)>

 

以下のように日にちを負の値にした場合は、月末から数えた日付となります。

プログラム

require "date"
p Date.new(2020, 1, -1)

実行結果

#<Date: 2020-01-31 ((2458880j,0s,0n),+0s,2299161j)>

 

文字列をDateオブジェクトに変換する

文字列をDateオブジェクトに変換する場合は、parse メソッドを使います。

プログラム

require "date"
p Date.parse("2020/01/01")

実行結果

#<Date: 2020-01-01 ((2458850j,0s,0n),+0s,2299161j)>

 

ほかにもさまざまなフォーマットに対応しています。

プログラム

require "date"
p Date.parse("20200101")

実行結果

#<Date: 2020-01-01 ((2458850j,0s,0n),+0s,2299161j)>

 

プログラム

require "date"
p Date.parse("20-1-1")

実行結果

#<Date: 2020-01-01 ((2458850j,0s,0n),+0s,2299161j)>

 

Dateオブジェクトを文字列に変換する

Dateオブジェクトを文字列に変換する場合は、strftime メソッドを使います。%Y%m などの書式を指定することで、そこに対応する要素が表示されます。

プログラム

require "date"
d = Date.today
p d.strftime("現在時刻は%Y年%m月%d日です。")

実行結果

"現在時刻は2019年04月09日です。"

 

よく使う書式一覧

書式 用途 出力例
%Y 西暦 2020
%y 西暦の下2桁 20
%m 0112
%d 0131
%A 曜日 Sunday, Monday
%a 曜日の省略形 Sun, Mon
%w 日曜日を起点(0)とした曜日の数 06
%B 月の名称 January, February
%Z タイムゾーン +00:00

 

DateオブジェクトをTimeオブジェクトに変換する

DateオブジェクトをTimeオブジェクトに変換する場合は、to_time メソッドを使います。

プログラム

require "date"

d = Date.today
p d.to_time

実行結果

2019-04-11 00:00:00 +0000

 

日付の一部分を取得する

日付の一部分を取得したい場合は、year や month、day メソッドなどが用意されています。

プログラム

require "date"

d = Date.today
p d.year # 年
p d.month # 月
p d.day # 日

実行結果

2019
4
9

 

日付の要素を取得するメソッド一覧

year
month
day
yday 1月1日からの通算日
wday 日曜日を起点(0)とした数

  • 0: 日曜日
  • 1: 月曜日
  • 2: 火曜日
  • 3: 水曜日
  • 4: 木曜日
  • 5: 金曜日
  • 6: 土曜日

 

日付を加減算する

Date オブジェクトに数値を足したり引いたりすることができます。1ごとに1日が加算・減算されます。

プログラム

require "date"

d = Date.today
p d
p d + 1 # 1日後の日付
p d - 1 # 1日前の日付

実行結果

#<Date: 2019-04-11 ((2458585j,0s,0n),+0s,2299161j)>
#<Date: 2019-04-12 ((2458586j,0s,0n),+0s,2299161j)>
#<Date: 2019-04-10 ((2458584j,0s,0n),+0s,2299161j)>
メモ

○日前を取得するには prev_day メソッド、○日後を取得するには next_day メソッドを使う方法もあります。

詳しくは ひとつ下の項目に書きました。

 

以下のように、Date オブジェクト同士の差を秒数で取得することもできます。

プログラム

require "date"
d1 = Date.new(2020, 1, 1)
d2 = Date.new(2020, 1, 31)
p (d2 - d1).to_i

実行結果

30
メモ

Date オブジェクト同士の差の結果は Rational オブジェクトになるので、to_i メソッドを使って数値に変換しています。

 

Dateオブジェクトの ○日前・○日後を取得する

Date オブジェクトから ○日前を取得するには prev_day メソッド、○日後を取得するには next_day メソッドを使います。

プログラム

require "date"

d = Date.new(2020, 1, 10)
p d.prev_day(3) # 3日前
p d.next_day(5) # 5日後

実行結果

#<Date: 2020-01-07 ((2458856j,0s,0n),+0s,2299161j)>
#<Date: 2020-01-15 ((2458864j,0s,0n),+0s,2299161j)>
メモ

○日前は - 、○日後は + を使って取得する方法もあります。

詳しくは ひとつ上の項目に書きました。

 

Dateオブジェクトの ○ヶ月前・○ヶ月後を取得する

Date オブジェクトから ○ヶ月前を取得するには prev_month メソッド、○ヶ月後を取得するには next_month メソッドを使います。

プログラム

require "date"

d = Date.new(2020, 1, 10)
p d.prev_month(1) # 1ヶ月前
p d.next_month(3) # 3ヶ月後

実行結果

#<Date: 2019-12-10 ((2458828j,0s,0n),+0s,2299161j)>
#<Date: 2020-04-10 ((2458950j,0s,0n),+0s,2299161j)>

 

以下のように ○ヶ月前は << 、○ヶ月後は >> を使って取得する方法もあります。

プログラム

require "date"

d = Date.new(2020, 1, 10)
p d << 1 # 1ヶ月前
p d >> 3 # 3ヶ月後

実行結果

#<Date: 2019-12-10 ((2458828j,0s,0n),+0s,2299161j)>
#<Date: 2020-04-10 ((2458950j,0s,0n),+0s,2299161j)>

 

Dateオブジェクトの ○年前・○年後を取得する

Date オブジェクトから ○年前を取得するには prev_year メソッド、○年後を取得するには next_year メソッドを使います。

プログラム

require "date"

d = Date.new(2020, 1, 10)
p d.prev_year(1) # 1年前
p d.next_year(3) # 3年後

実行結果

#<Date: 2019-01-10 ((2458494j,0s,0n),+0s,2299161j)>
#<Date: 2023-01-10 ((2459955j,0s,0n),+0s,2299161j)>

 

日付を比較する

Date オブジェクト同士で比較することができます。

プログラム

require "date"

d1 = Date.new(2020, 1, 1)
d2 = Date.new(2020, 1, 2)

p d1 > d2
p d1 <= d2
p d1 == d2

実行結果

false
true
false
メモ

>, <=, == などの使い方について詳しくは、以降のこちらの記事に書きました(作成中)。

 

DateTimeクラスの使い方

日付と時刻を扱う DateTimeクラスの使い方を解説します。

ポイント

日付と時刻を扱いたい場合は Timeクラスがあるので 基本的にはそちらを使い、必要があれば DateTime クラスを利用すると良いかと思います。

DateTimeクラスは Dateクラスのサブクラスとなっており、Dateクラスの多くの同じ機能が使えます。

DateTimeクラスを使う際には、あらかじめ以下のコードを追加しておく必要があります。

require "date"

 

今の日時を取得する

今の日時を取得したい場合は、now メソッドを使います。

プログラム

require "date"
p DateTime.now

実行結果

#<DateTime: 2019-04-11T08:18:00+00:00 ((2458585j,29880s,358684124n),+0s,2299161j)>

 

指定した日時のオブジェクトを作成する

指定した日時のオブジェクトを作成する場合は、new メソッドを使います。

一番最後の引数は協定世界時との時差(単位: 日)を指定します。日本の時差を指定する場合は9時間なので、「9/24」日となり、0.375 を指定します。

プログラム

require "date"
p DateTime.new(2020, 1, 1, 12, 0, 45, 0.375)

実行結果

#<DateTime: 2020-01-01T12:00:45+09:00 ((2458850j,10845s,0n),+32400s,2299161j)>

 

以下のように日にちを負の値にした場合は、月末から数えた日付となります。

プログラム

require "date"
p DateTime.new(2020, 1, -1, 12, 0, 45, 0.375)

実行結果

#<DateTime: 2020-01-31T12:00:45+09:00 ((2458880j,10845s,0n),+32400s,2299161j)>

 

文字列をDateTimeオブジェクトに変換する

文字列をDateTimeオブジェクトに変換する場合は、parse メソッドを使います。

プログラム

require "date"
p Date.parse("2020/01/01 12:00:45")

実行結果

#<DateTime: 2020-01-01T12:00:45+00:00 ((2458850j,43245s,0n),+0s,2299161j)>

 

ほかにもさまざまなフォーマットに対応しています。

プログラム

require "date"
p DateTime.parse("20200101120045")

実行結果

#<DateTime: 2020-01-01T12:00:45+00:00 ((2458850j,43245s,0n),+0s,2299161j)>

 

プログラム

require "date"
p DateTime.parse("20-1-1 12:5")

実行結果

#<DateTime: 2020-01-01T12:05:00+00:00 ((2458850j,43500s,0n),+0s,2299161j)>

 

DateTimeオブジェクトを文字列に変換する

DateTimeオブジェクトを文字列に変換する場合は、strftime メソッドを使います。%Y%m などの書式を指定することで、そこに対応する要素が表示されます。

プログラム

require "date"
d = DateTime.now
p d.strftime("現在時刻は%Y年%m月%d日です。")

実行結果

"現在時刻は2019年04月09日です。"

 

よく使う書式一覧

書式 用途 出力例
%Y 西暦 2020
%y 西暦の下2桁 20
%m 0112
%d 0131
%H 時(24時間制) 0023
%l 時(12時間制) 0112
%M 0059
%S 006060 はうるう秒)
%A 曜日 Sunday, Monday
%a 曜日の省略形 Sun, Mon
%w 日曜日を起点(0)とした曜日の数 06
%B 月の名称 January, February
%p 午前または午後 AM, PM
%Z タイムゾーン +00:00

 

DateTimeオブジェクトをTimeオブジェクトに変換する

DateTimeオブジェクトをTimeオブジェクトに変換する場合は、to_time メソッドを使います。

プログラム

require "date"

d = DateTime.now
p d.to_time

実行結果

2019-04-11 08:39:18 +0000

 

日付や時刻の一部分を取得する

日付や時刻の一部分を取得したい場合は、year や month、day メソッドなどが用意されています。

プログラム

require "date"

d = DateTime.now
p d.year # 年
p d.month # 月
p d.day # 日

実行結果

2019
4
9

 

日付・時刻の要素を取得するメソッド一覧

year
month
day
hour
min
sec
yday 1月1日からの通算日
wday 日曜日を起点(0)とした数

  • 0: 日曜日
  • 1: 月曜日
  • 2: 火曜日
  • 3: 水曜日
  • 4: 木曜日
  • 5: 金曜日
  • 6: 土曜日
zone タイムゾーンを表す文字列(例: +00:00

 

日付を加減算する

DateTime オブジェクトに数値を足したり引いたりすることができます。1ごとに1日が加算・減算されます。

プログラム

require "date"

d = DateTime.now
p d
p d + 1 # 1日後の日付
p d - 1 # 1日前の日付

実行結果

#<DateTime: 2019-04-11T09:57:34+00:00 ((2458585j,35854s,981406715n),+0s,2299161j)>
#<DateTime: 2019-04-12T09:57:34+00:00 ((2458586j,35854s,981406715n),+0s,2299161j)>
#<DateTime: 2019-04-10T09:57:34+00:00 ((2458584j,35854s,981406715n),+0s,2299161j)>
メモ

○日前を取得するには prev_day メソッド、○日後を取得するには next_day メソッドを使う方法もあります。

詳しくは ひとつ下の項目に書きました。

 

以下のように、DateTime オブジェクト同士の差を日数で取得することもできます。

プログラム

require "date"
d1 = DateTime.new(2020, 1, 1, 12, 0, 0, 0.375)
d2 = DateTime.new(2020, 1, 3, 0, 0, 0, 0.375)
p d2 - d1

実行結果

(3/2)
メモ

結果の単位は日なので、(3/2) は 1.5日を表します。

 

DateTimeオブジェクトの ○日前・○日後を取得する

DateTime オブジェクトから ○日前を取得するには prev_day メソッド、○日後を取得するには next_day メソッドを使います。

プログラム

require "date"

d = DateTime.new(2020, 1, 10, 0, 0, 0, 0.375)
p d.prev_day(3) # 3日前
p d.next_day(5) # 5日後

実行結果

#<DateTime: 2020-01-07T00:00:00+09:00 ((2458855j,54000s,0n),+32400s,2299161j)>
#<DateTime: 2020-01-15T00:00:00+09:00 ((2458863j,54000s,0n),+32400s,2299161j)>
メモ

○日前は - 、○日後は + を使って取得する方法もあります。

詳しくは ひとつ上の項目に書きました。

 

DateTimeオブジェクトの ○ヶ月前・○ヶ月後を取得する

DateTime オブジェクトから ○ヶ月前を取得するには prev_month メソッド、○ヶ月後を取得するには next_month メソッドを使います。

プログラム

require "date"

d = DateTime.new(2020, 1, 10, 0, 0, 0, 0.375)
p d.prev_month(1) # 1ヶ月前
p d.next_month(3) # 3ヶ月後

実行結果

#<DateTime: 2019-12-10T00:00:00+09:00 ((2458827j,54000s,0n),+32400s,2299161j)>
#<DateTime: 2020-04-10T00:00:00+09:00 ((2458949j,54000s,0n),+32400s,2299161j)>

 

以下のように ○ヶ月前は << 、○ヶ月後は >> を使って取得する方法もあります。

プログラム

require "date"

d = DateTime.new(2020, 1, 10, 0, 0, 0, 0.375)
p d << 1 # 1ヶ月前
p d >> 3 # 3ヶ月後

実行結果

#<DateTime: 2019-12-10T00:00:00+09:00 ((2458827j,54000s,0n),+32400s,2299161j)>
#<DateTime: 2020-04-10T00:00:00+09:00 ((2458949j,54000s,0n),+32400s,2299161j)>

 

DateTimeオブジェクトの ○年前・○年後を取得する

DateTime オブジェクトから ○年前を取得するには prev_year メソッド、○年後を取得するには next_year メソッドを使います。

プログラム

require "date"

d = DateTime.new(2020, 1, 10, 0, 0, 0, 0.375)
p d.prev_year(1) # 1年前
p d.next_year(3) # 3年後

実行結果

#<DateTime: 2019-01-10T00:00:00+09:00 ((2458493j,54000s,0n),+32400s,2299161j)>
#<DateTime: 2023-01-10T00:00:00+09:00 ((2459954j,54000s,0n),+32400s,2299161j)>

 

日付を比較する

DateTime オブジェクト同士で比較することができます。

プログラム

require "date"

d1 = DateTime.new(2020, 1, 1, 0, 0, 0, 0.375)
d2 = DateTime.new(2020, 1, 2, 0, 0, 0, 0.375)

p d1 > d2
p d1 <= d2
p d1 == d2

実行結果

false
true
false
メモ

>, <=, == などの使い方について詳しくは、以降のこちらの記事に書きました(作成中)。

 

まとめ

以上、Ruby で日付や時刻を扱う基本的な方法でした!

 

ここまでの内容をまとめておきます。

  • Ruby で日付と時刻を扱うときは Timeクラス、日付を扱うときは Dateクラスを使う(DateTimeクラスは必要に応じて利用すると良さそう)。
  • それぞれのクラスで用意されているメソッドを使うことで、日付・時刻の取得、表示、加減算、比較、他の型への変換を行うことができる。