LoginSignup
0
1

More than 3 years have passed since last update.

Railsアプリで日時の取得にはどのクラスを使うべきか(Time, DateTime, TimeWithZone)

Posted at

日時の取得はどのクラスを使うべきか

  • 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を使おう

現在の日時を取得する場合、以下の方法があります。

  1. Time.now (環境変数のタイムゾーンを使う)
  2. DateTime.now (環境変数のタイムゾーンを使う)
  3. Time.current (application.rbのタイムゾーンを使う)
  4. 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

0
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
0
1