アプリケーション開発を行うときに、ユーザーの登録日時を登録したり、商品が買われた時間を保存したりするなど、日付や時刻を扱う場面が出てきます。
ここでは 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 |
月 | 01 〜 12 |
%d |
日 | 01 〜 31 |
%H |
時(24時間制) | 00 〜 23 |
%l |
時(12時間制) | 01 〜 12 |
%M |
分 | 00 〜 59 |
%S |
秒 | 00 〜 60 (60 はうるう秒) |
%A |
曜日 | Sunday , Monday |
%a |
曜日の省略形 | Sun , Mon |
%w |
日曜日を起点(0)とした曜日の数 | 0 〜 6 |
%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)とした数
|
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 |
月 | 01 〜 12 |
%d |
日 | 01 〜 31 |
%A |
曜日 | Sunday , Monday |
%a |
曜日の省略形 | Sun , Mon |
%w |
日曜日を起点(0)とした曜日の数 | 0 〜 6 |
%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)とした数
|
日付を加減算する
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 |
月 | 01 〜 12 |
%d |
日 | 01 〜 31 |
%H |
時(24時間制) | 00 〜 23 |
%l |
時(12時間制) | 01 〜 12 |
%M |
分 | 00 〜 59 |
%S |
秒 | 00 〜 60 (60 はうるう秒) |
%A |
曜日 | Sunday , Monday |
%a |
曜日の省略形 | Sun , Mon |
%w |
日曜日を起点(0)とした曜日の数 | 0 〜 6 |
%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)とした数
|
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クラスは必要に応じて利用すると良さそう)。
- それぞれのクラスで用意されているメソッドを使うことで、日付・時刻の取得、表示、加減算、比較、他の型への変換を行うことができる。