結論
- 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
スターバックスのたまごのサンドイッチを食べて落ち着いてください
ここは東京ですか?アメリカですか?
Original by Github issue
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。