【Rails】Railsだから出来る!日時関連の便利メソッド20選

Ruby on Rails

※この記事は、ユアマイスター Advent Calendar 2021の14日目の記事です。

こんにちは、ジョンです!
今回は、Railsならではの便利な日付・時間操作のメソッドについてまとめてみました。

備忘録を兼ねて、便利なメソッドを一気にご紹介します!

この記事で、少しでもRailsに興味を持ってくれる方が増えてくれると嬉しい限りです。

関連するお話

【Rails】現在日時の取得方法を解説!currentとnowの違いは?
今回は、簡単そうに見えて意外と複雑?現在日時の取得にまつわるお話をまとめてみました。私がフリーランスでお仕事をしていても、結構よくある不具合についてまとめてみましたので、もしどなたかの不具合調査の手助けになれば幸いです。
スポンサーリンク

前提

現在、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

()内の引数について

基本的に、英単語の通りの引数が使用できます。

メソッド意味使用例
seconds3.seconds :3秒
minutes3.minutes :3分
hours時間3.hours :3時間
days3.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

なんてメソッドを作って使っています。結構便利です。

ただし土日休みの場合に限る

この記事が、どなたかのお役に立てれば幸いです。

タイトルとURLをコピーしました