を調べてたメモ。数があるので前後セットで覚えるのが良さそう。
前後の日付を返す
tomorrow
,yesterday
で翌日、前日の日付を返す。next_year
,prev_year
で翌年、去年の日付を返す。next_month
,prev_month
で翌月、前月の日付を返す。
はじめ、終わりを返す
beginning_of_week
,end_of_week
はレシーバの日付からそれぞれ週の初めと終わりを返す。 基準となる曜日はconfig.beginning_of_week
で指定することができる。beginning_of_day
はレシーバの日付の0時0分を返す。end_of_day
はレシーバの日付の23時59分59秒を返す- 厳密にはミリ秒まで計算されていて、
#iso8601
https://docs.ruby-lang.org/ja/latest/method/Time/s/iso8601.htmlを使うと手っ取り早く確認できる。- MySQLはミリ秒を切り捨てるので、テストのときにハマるらしい
- 厳密にはミリ秒まで計算されていて、
[60] pry(main)> DateTime.now.tap{|t| p t.iso8601(6)}.end_of_day.iso8601(6) "2018-11-08T10:42:05.750411+09:00" => "2018-11-08T23:59:59.999999+09:00"
特定の値分前後させた日付を返す
years_ago n
はn年前の日付を返すyears_since n
はn年後の日付を返す
特定の日付にする
advance
はレシーバの日付を基準にしてハッシュで指定した年月日の数値分を加減算する。
[37] pry(main)> Date.today.tap{|d| p d}.advance(years: 1, months: 1, days:-1) Thu, 08 Nov 2018 => Sat, 07 Dec 2019
change
はレシーバの日付を無視してハッシュで指定した年月日の数値に変更する。advance
と違ってハッシュは単数- 負数を入れると配列と同じように最後を返すので、月末にも対応できる。けどend_of_monthを使うのが良さそう。
[47] pry(main)> Date.today.tap{|d| p d}.change(year: 2012, month: 2, day:-1) Thu, 08 Nov 2018 => Wed, 29 Feb 2012