Rails3のDate.currentのソースコードリーディング
# config/application.rb
module Hoge
class Application < Rails::Application
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'
end
end
- プロジェクトが作成されたばかりの設定を見ると、デフォルトのタイムゾーンはTime.zoneを参照していることがわかる。
- Date.currentのソースコードからもそれが読み取れる。
# activesupport/lib/active_support/core_ext/date/calculations.rb
require 'date'
class Date
class << self
def current
::Time.zone ? ::Time.zone.today : ::Date.today
end
end
end
# lib/date.rb
class Date
def self.today(sg=ITALY)
t = Time.now
jd = civil_to_jd(t.year, t.mon, t.mday, sg)
new!(jd_to_ajd(jd, 0, 0), 0, sg)
end
end
- TimeクラスはC言語で実装されてるっぽいので、よくわからない。けど、タイムゾーンはシステムのものを使っていると思われる。
ruby-1.9.2-p180 :001 > Date.current
=> Mon, 01 Aug 2011
ruby-1.9.2-p180 :002 > Time.zone
=> (GMT+00:00) UTC
ruby-1.9.2-p180 :003 > Time.zone.today
=> Mon, 01 Aug 2011
$ date
Mon Aug 1 23:05:00 JST 2011
- ん?でも、タイムゾーンはJSTになってる。ここまで低水準だともうわから〜ん。
# config/application.rb
module Hoge
class Application < Rails::Application
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'
config.time_zone = 'Tokyo'
end
end
- 試しに設定を日本時に変更してみると…
ruby-1.9.2-p180 :001 > Time.zone
=> (GMT+09:00) Tokyo
-
Time.zoneは変更された。
-
Railsアプリケーションのタイムゾーンを調べる場合はTime.zoneで確認できるようだ。
-
追記
$ date
2011年 8月2日 火曜日 00時04分59秒 JST
ruby-1.9.2-p180 :001 > Date.current
=> Mon, 01 Aug 2011
ruby-1.9.2-p180 :002 > Date.today
=> Mon, 02 Aug 2011
ruby-1.9.2-p180 :003 > Time.zone
=> (GMT+00:00) UTC
ruby-1.9.2-p180 :004 > Time.now
=> 2011-08-02 00:05:23 +0900
Date.currentとDate.todayでタイムゾーンが異なるのは、前者がTime.zoneを参照しているからで、後者がTime.nowを参照しているからなのだが、それらが違うのがまた謎だ…