🖥

Rails で Date.today Date.current Date.tomorrow Date.yesterdat やらの日付が違うし

2019/10/31に公開

結論

  • Date.today は Ruby のもの。ENV や システムのタイムゾーンを参照するらしい。
  • Date.current Date.yesterday Date.tomorrow は Rails のもの。Railsのconfigを参照するらしい。
  • RailsのメソッドとRubyのメソッドで扱うタイムゾーンが違う場合が出てくる。
  • Railsで使うのは Date.today ではなく Date.current にしておくのが無難かも。

Date.today

  • Rubyのメソッド。
  • ENV もしくはシステムのタイムゾーンを見るらしい。
  • pryを起動して確認してみる。てきとうに日本時間とずれるタイムゾーンを指定してみる。
[14] pry(main)> ENV['TZ'] = 'Asia/Tokyo'
=> "Asia/Tokyo"
[15] pry(main)> Date.today
=> Thu, 31 Oct 2019
[12] pry(main)> ENV['TZ'] = 'America/Phoenix'
=> "America/Phoenix"
[13] pry(main)> Date.today
=> Wed, 30 Oct 2019

システムのタイムゾーンとは?

date コマンドで見えるやつだろうか

date
Thu Oct 31 01:27:24 UTC 2019

Date.current

  • Railsのconfigを見るらしい。
  • rails console で確認してみる。
  • application.rbの config.time_zone = 'Tokyo' あたりを書き換えてテストする。設定を書き換えたら rails console を exit して再起動する。
[1] pry(main)> Rails.application.config.time_zone
=> "Tokyo"
[2] pry(main)> Date.current
=> Thu, 31 Oct 2019
[1] pry(main)> Rails.application.config.time_zone
=> "America/Phoenix"
[2] pry(main)> Date.current
=> Wed, 30 Oct 2019

何故こんなことが起こるのか?

  • Rails では Date.yesterday Date.tomorow っていう便利なメソッドを作ったよ!
  • Rails のメソッドだから rails の config を参照するよ! 直感的に書けて便利だね!
  • でも Date.today は Ruby 本来のメソッドなので動作を書き換えないよ。仕方ないね、早いもの勝ちだし。
  • そうだ、Rails のために新しいメソッド Date.current を作ろう! わりとわかりやすいでしょ?
  • こうして Railsのメソッドは Date.yesterday Date.current Date.tomorow の三個で Date.today は Ruby のもの、という残念な落とし穴が発生した

今日はどこにも存在しない

[4] pry(main)> Date.yesterday
=> Wed, 30 Oct 2019
[5] pry(main)> Date.today
=> Wed, 30 Oct 2019
[6] pry(main)> Date.tomorrow
=> Fri, 01 Nov 2019

参考

RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い - Qiita

スターバックスのたまごのサンドイッチを食べて落ち着いてください

ここは東京ですか?アメリカですか?

image

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2644

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2019-10-31

Discussion