日時の取得はどのクラスを使うべきか
- Timeクラス
- DateTimeクラス
- TimeWithZoneクラス
Railsでは、特別な理由がない限り、
TimeクラスやDateTimeクラスより、TimeWithZoneクラスで統一した方が良い。
タイムゾーンについて
タイムゾーンを設定する場所は3箇所あります。
- システム
- 環境変数
ENV['TZ']
- application.rb
application.rbにどのタイムゾーンが設定してあるか確認するには、Time.zone.name
を使います。
# application.rb
config.time_zone = 'Tokyo'
Time.zone.name
=> "Tokyo"
どのタイムゾーンが使われるのか
ややこしいことに、クラスやそのクラスに関連するメソッドによってどのタイムゾーンが使われるか変わります。
例えば、
Timeクラスに関連するメソッドnow
を使ったTime.now
は環境変数のタイムゾーンを使い、
Timeクラスに関連するメソッドcurrent
を使ったTime.current
はapplication.rbのタイムゾーンを使います。
#環境変数が使われ、classはTimeになる
[1] pry(main)> Time.now
=> 2020-07-31 19:39:18 +0900
[2] pry(main)> Time.now.class
=> Time
#application.rbが使われ、classはTimeWithZoneになる
[3] pry(main)> Time.current
=> Fri, 31 Jul 2020 19:39:35 JST +09:00
[4] pry(main)> Time.current.class
=> ActiveSupport::TimeWithZone
現在の日時の取得にはTime.currentかTime.zone.nowを使おう
現在の日時を取得する場合、以下の方法があります。
- Time.now (環境変数のタイムゾーンを使う)
- DateTime.now (環境変数のタイムゾーンを使う)
- Time.current (application.rbのタイムゾーンを使う)
- Time.zone.now (application.rbのタイムゾーンを使う)
結論としては、TimeWithZoneクラスである3または4を使っておいた方が良いです(もし国際的なアプリケーションにしようと思ったら色々と器用に扱える為)。
# 環境変数のタイムゾーンが使われる
[1] pry(main)> Time.now
=> 2020-07-31 19:43:14 +0900 #Timeクラス
[2] pry(main)> DateTime.now
=> Fri, 31 Jul 2020 19:43:21 +0900 #DateTimeクラス
# application.rbのタイムゾーンが使われる
[3] pry(main)> Time.current
=> Fri, 31 Jul 2020 19:43:26 JST +09:00 #ActiveSupport::TimeWithZoneクラス
[4] pry(main)> Time.zone.now
=> Fri, 31 Jul 2020 19:43:32 JST +09:00 #ActiveSupport::TimeWithZoneクラス
参考記事
以下の記事を参考にしました。記事ではとても詳しく説明してあります。
https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c