※この記事は、ユアマイスター Advent Calendar 2021の14日目の記事です。
こんにちは、ジョンです!
今回は、Railsならではの便利な日付・時間操作のメソッドについてまとめてみました。
備忘録を兼ねて、便利なメソッドを一気にご紹介します!
この記事で、少しでもRailsに興味を持ってくれる方が増えてくれると嬉しい限りです。
関連するお話

前提
現在、2021/12/14 13:00:00 とします。
current_time = Time.zone.now
=> Tue, 14 Dec 2021 13:00:00 JST +09:00
フォーマットを変更する
表示形式を変更する
current_time.strftime("%Y年%m月%d日 %H時%M分%S秒")
=> "2021年12月14日 13時00分00秒"
曜日を取得する
current_time.strftime("%A")
=> "Tuesday"
別タイムゾーンの日時を取得する
current_time.in_time_zone("Hawaii")
=> Tue, 14 Dec 2021 01:00:00 HST -10:00
時刻操作
昨日、明日の日付を取得
current_time.yesterday
=> Mon, 13 Dec 2021 13:00:00 JST +09:00
current_time.tomorrow
=> Wed, 15 Dec 2021 13:00:00 JST +09:00

まんまかよ!
って感じですが、本当にそのまんまです。
視覚的に分かりやすくていいですね。
先週○曜日の日付を取得
current_time.prev_week(:sunday)
=> Sun, 12 Dec 2021 00:00:00 JST +09:00
細かいんですが、「先週の日曜日」で、2日前の日付が出てくると、
あってるけど、なんかすごく違和感ありますね…笑
来週○曜日の日付を取得
current_time.next_week(:monday)
=> Mon, 20 Dec 2021 00:00:00 JST +09:00
過去の日時を取得
current_time.ago(3.days)
=> Sat, 11 Dec 2021 13:00:00 JST +09:00
未来の日時を取得
current_time.since(3.days)
=> Fri, 17 Dec 2021 13:00:00 JST +09:00
()内の引数について
基本的に、英単語の通りの引数が使用できます。
メソッド | 意味 | 使用例 |
seconds | 秒 | 3.seconds :3秒 |
minutes | 分 | 3.minutes :3分 |
hours | 時間 | 3.hours :3時間 |
days | 日 | 3.days :3日 |
weeks | 週間 | 3.weeks :3週間 |
month | ヶ月 | 3.month :3ヶ月 |

○週間前という指定ができるのは便利ですよね!
週初、週末の時刻を取得
Railsの1週間は月曜日から始まり、日曜日で終わります。
週初
current_time.beginning_of_week
=> Mon, 13 Dec 2021 00:00:00 JST +09:00
週末
current_time.end_of_week
=> Sun, 19 Dec 2021 23:59:59 JST +09:00
月初、月末の時刻を取得
月初
current_time.beginning_of_month
=> Wed, 01 Dec 2021 00:00:00 JST +09:00
月末
current_time.end_of_month
=> Fri, 31 Dec 2021 23:59:59 JST +09:00

ちなみに、閏年にもしっかり対応しております
current_time.since(2.years).since(2.month).end_of_month
=> Thu, 29 Feb 2024 23:59:59 JST +09:00
年初、年末の時刻を取得
年初
current_time.beginning_of_year
=> Fri, 01 Jan 2021 00:00:00 JST +09:00
年末
current_time.end_of_year
=> Fri, 31 Dec 2021 23:59:59 JST +09:00
ここまでの○初、○末をすべて見ればわかりますが、
Railsは本当に「これがほしい」と思った内容を、そのまま英単語にして、
メソッドとして繋げると、大抵メソッドが存在するので、すごいですね。
範囲指定
これから紹介するのは、〜〜の期間の日付を取得したい、という時に使える便利なメソッドです。
例えば between?(start, end) などで日付を取得する際に役に立ちます。
今日1日の間
current_time.all_day
=> Mon, 14 Dec 2021 00:00:00 JST +09:00..Sun, 14 Dec 2021 23:59:59 JST +09:00
これは、where句にそのまま使用することも出来ます。
User.where(created_at: current_time.all_day)
=> User Load (25.0ms) SELECT `users`.* FROM `users` WHERE `users`.`created_at` BETWEEN '2021-12-14 00:00:00' AND '2021-12-14 23:59:59'
この1週間の間
current_time.all_week
=> Mon, 13 Dec 2021 00:00:00 JST +09:00..Sun, 19 Dec 2021 23:59:59 JST +09:00
ちゃんと月曜日スタート、日曜日の23時59分59秒までの時刻が取れています。
これも、where句にそのまま使用することも出来ます。
User.where(created_at: current_time.all_week)
=> User Load (140.7ms) SELECT `users`.* FROM `users` WHERE `users`.`created_at` BETWEEN '2021-12-13 00:00:00' AND '2021-12-19 23:59:59'
この1ヶ月の間
current_time.all_month
=> Mon, 13 Dec 2021 00:00:00 JST +09:00..Sun, 19 Dec 2021 23:59:59 JST +09:00
もちろん、これもwhere句にそのまま使用できます。
User.where(created_at: current_time.all_month)
=> User Load (25.2ms) SELECT `users`.* FROM `users` WHERE `users`.`created_at` BETWEEN '2021-12-01 00:00:00' AND '2021-12-31 23:59:59'
今月登録してくれたユーザー一覧、みたいな機能はよく使うので、
個人的には、とても重宝しているメソッドのひとつです。
判定系のメソッド
この日は今日の日付?
current_time.today?
=> true
見たまんまですね、正直あんまり使わないです。
余談ですが、今日か否かを判定する際に使用している比較日付は、
Time.zone.now の日付と比較しているみたいです。
この日は○曜日?
current_time.sunday?
=> false
まとめ
いかがだったでしょうか?
Railsで使える日付操作系のメソッドは、コードレビューの際にも非常に分かりやすく、
メソッドの中身を知らない人でも、どんな結果が返ってくるかすぐ想像の出来る、
とても便利な物が多いです。

私がRailsにハマったキッカケは、実はここだったりするんですよね 笑
私はよく、○年の祝日というテーブル(Holiday)を1つ作っておいて、
# お休みの日か否か判定する
def holiday?(target_date)
# 祝日一覧を格納しているHolidayテーブルから日付一覧を取得
holiday_list = Holiday.where(date: target_date.all_month).pluck(:date)
target_date.saturday? || target_date.sunday? || holiday_list.include?(target_date)
end
なんてメソッドを作って使っています。結構便利です。

ただし土日休みの場合に限る
この記事が、どなたかのお役に立てれば幸いです。