/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

Rails で1日前とか1週間前とか

Railsのアプリを作っているときに「今日投稿したデータを調べる」とか「昨日投稿したデータを調べる」とかの"今日"、"昨日"という表現を毎回迷ってしょっちゅう忘れるので備忘録として記録しておく。

日付を範囲で取得する

ちなみに今日が2/24です。そのうえで表現すると以下になります。

今日: Time.zone.now.all_day
昨日:1.day.ago.all_day
1週間前:1.week.ago.all_day
1か月前:1.month.ago.all_day

rails c で確認したコンソール結果がこちら。

Running via Spring preloader in process 2639
Loading development environment (Rails 4.2.5)
2.3.4 :001 > Time.zone.now.all_day
 => Sat, 24 Feb 2018 00:00:00 JST +09:00..Sat, 24 Feb 2018 23:59:59 JST +09:00 
2.3.4 :002 > 1.day.ago.all_day
 => Fri, 23 Feb 2018 00:00:00 JST +09:00..Fri, 23 Feb 2018 23:59:59 JST +09:00 
2.3.4 :003 > 1.week.ago.all_day
 => Sat, 17 Feb 2018 00:00:00 JST +09:00..Sat, 17 Feb 2018 23:59:59 JST +09:00 
2.3.4 :004 > 1.month.ago.all_day
 => Wed, 24 Jan 2018 00:00:00 JST +09:00..Wed, 24 Jan 2018 23:59:59 JST +09:00 
2.3.4 :005 > 

上記の結果の通り、「..」で範囲としてとれるからこの書き方、気に入っています。

 

beginning_of_dayとかも組み合わせると便利

範囲ではなくその日、ピンポイントで取りたい場合は、beginning_of_dayとend_of_dayを組み合わせるといいかも。

2.3.4 :007 > 1.week.ago.beginning_of_day
 => Sat, 17 Feb 2018 00:00:00 JST +09:00 
2.3.4 :008 > 1.week.ago.end_of_day
 => Sat, 17 Feb 2018 23:59:59 JST +09:00 
2.3.4 :009 > 

例えば今週1週間分のデータをモデルから検索するとなった場合は、

Mode.where(created_at: 1.week.ago.beginning_of_day..Time.zone.now.end_of_day)

と書けばいい。

 

参考にしたサイト

自分が必要な部分しか今回の記事にはしていないので、もっと詳しく理解するにはタイムゾーンの絡みとかトータル的に書いている以下の記事を参考にするのがいいと思います。

RailsのActiveRecordで今日・昨日など特定の日に保存されたレコードを取得 | EasyRamble

それではー。

Real Time Web Analytics