先日導入したEdge Rails のタイムゾーンサポートのおかげで、Railsアプリケーションでの日別レポート出力なんかがグッと楽になったのですが、USタイムゾーンでのレポートでテストにこける時が出てきました。
思いつくことといえばサマータイムなので調べてみます(本当はここに辿り着くまでにMySQLで何とかしようとしてハマりましたが。。。)
>> Time.zone = 'Central Time (US & Canada)'
=> "Central Time (US & Canada)"
>> Time.zone.formatted_offset
=> "-06:00"
>> Time.zone.now
=> Sat, 19 Apr 2008 03:46:21 CDT -05:00
>> Time.zone.now.formatted_offset
=> "-05:00"
そりゃそうだ。"now"も付けずにサマータイムかどうかなんて判断できませんよね。Time.zone.formatted_offsetをTime.zone.now.formatted_offsetに修正して、あっさり解決です。
MySQLにUTCで保存されているデータから、当日追加されたユーザー数を見る場合だとこんな感じ。
Time.zone = @current_user.timezone
offset = Time.zone.now.formatted_offset
today = Time.zone.now.strftime('%Y-%m-%d')
User.count(:conditions => [
"DATE(CONVERT_TZ(created_at, '+00:00', :offset)) = :today",
{ :offset => offset, :today => today }
])