日本のサービスだし運用の都合がいいJSTに全て変換しよう!というのはよくあると思うんですが、
「あれやっぱりグローバル対応を見据えてUTCに..」
「ほかがUTCだから揃えたい..」
っていう展開になったときに戻す手順です。
1. EC2インスタンスのタイムゾーンをUTCに。
1-1. まずはインスタンスのTimezone設定を戻す。
ls -al /etc/localtime
# cp
sudo cp /usr/share/zoneinfo/UTC /etc/localtime
# ln -s
sudo ln -s /usr/share/zoneinfo/UTC /etc/localtime
注意:
必ずls -alして現状を確認しましょう。
記事によってはシンボリックリンクでやるやり方があるが、そこをcpで上書きしてしまうと、大本の/usr/share/zoneinfo/Japanを上書きしてしまい、戻すのはできますが面倒です(戻すはめになった経験あり)。
##【追記】1-2. サーバーの再起動
timezoneを変更した場合、全てのプロセスに変更を反映させるために、サーバーの再起動が必要です。(hirot78さん、ご指摘ありがとうございます!)
$ sudo reboot
2. active_recordのtimezoneをデフォルトのUTCに。
active recordの設定がlocalになっている場合は戻しましょう。デフォルトはUTCになります。
config.time_zone = 'Tokyo'
- config.active_record.default_timezone = :local
+ # config.active_record.default_timezone = :local
3. Time.now, DateTime.now、Date.todayをTime.zoneで置き換え
JSTを意図して書いていたTme,DateTime,Dateを書き換えます。timezone設定を変えたことで意図した時間にならないケースがあるためです。
よくあるのは以下のようなケースでしょうか。
Time.now => Time.zone.now
DateTime.now => Time.zone.now
Date.today => Time.zone.now.to_date or Time.current.to_date
TimeとTime.zoneの違いは、config.time_zone = 'Tokyo' で指定したタイムゾーンかどうかです。
# timezoneがTokyoの場合
> Time.now
=> 2015-04-14 14:37:19 +0000 #UTC
> Time.zone.now
=> Tue, 14 Apr 2015 23:37:25 JST +09:00
> Time.current
=> Tue, 14 Apr 2015 23:37:29 JST +09:00
> Time.current.to_date
=> Tue, 14 Apr 2015
> Date.today
=> Tue, 14 Apr 2015 # defaultのタイムゾーンでのdateとなってしまうので注意。
ポイントはなるべくTime.zoneを使うことです。Dateもつかってもいいですが、Date.todayなどはUTC時間で呼ばるため注意。timezoneのtodayがほしいときはTime.current.to_dateがスマート。
以上。
参考