7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails の日付や時間の処理を読みやすく書く方法まとめ

Last updated at Posted at 2020-03-14

Rails には Time 型、Date 型、Duration 型など時間に関わらる様々な型があり、その全てに様々なエイリアスが生えています。
様々なユースケースにおいて、日付演算が読みやすくなるように配慮された結果だと思いますが、時たま難解な組み合わせに出会うことがあります。極端な例ですが、3.days.from_now(Time.current.yesterday) などのような感じです。正直いつの時点を指しているのかパット見でよくわかりません。

実は読みやすさだけを考えた場合、選べる選択肢はそれほど多くありません。
その読みやすくなるパターンについてまとめてみたいと思います。

シフトさせる時間や日数が具体的にわかっている場合

Duration 型に対して対象の日付を渡す方法が最も自然に読めると思います。
具体例としては、

3.days.from_now # 3日後
3.days.ago # 3日後
3.days.after(some_event) # some_event から3日後
3.days.before(some_event) # some_event の3日前

です。sinceuntil などもありますが、これは継続を表したいパターンで明らかに上手くハマる、みたいなケースを除いて使う必要は無いかなと思います。

パターンは以下のとおりです。

起点\表す時点 過去 未来
現在 ago from_now
過去・未来 before after

シフト先の時間はわかっているが具体的な差がわかっていない場合

言ってしまえば、Duration オブジェクトを定義しづらい場合です。
この場合はもちろん Date や Time に対して、メソッド呼び出しを行います。

Time.current.noon # 正午
Time.current.beginning_of_week # 週初め

実はこちらの場合では特に言うことがありません。

まとめ

  • Duration を使える場合は Duration へのメソッド呼び出しにする (e.g. 3.days.ago)
  • Duration に対して使うメソッドは基本 ago, from_now, before, after の4つで良い
  • Duration を使えない場合のみ、Time や Date へのメソッド呼び出しを行う
7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?