3

タイムゾーンを設定しました。

config.time_zone = 'Mountain Time (US & Canada)'

コンソールからクリスマスイベントを作成しています...

c = Event.new(:title => "Christmas") 

時間の使用:

c.start = Time.new(2012,12,25)  
=> 2012-12-25 00:00:00 -0700 #has correct offset  
c.end = Time.new(2012,12,25).end_of_day  
=> 2012-12-25 23:59:59 -0700 #same deal  

DateTimeの使用:

c.start = DateTime.new(2012,12,25)  
=> Tue, 25 Dec 2012 00:00:00 +0000 # no offset  
c.end = DateTime.new(2012,12,25).end_of_day  
=> Tue, 25 Dec 2012 23:59:59 +0000 # same  

入力がconfig.time_zoneにあると想定して、不注意にDateTimeを使用してきましたが、これがデータベースに保存されるときに変換は行われません。戻り値(db用にフォーマットされたもの)とまったく同じように保存されます。

Timeの使用は実際には大したことではありませんが、DateTimeを使用していて、それを正しいゾーンに配置したい場合はいつでも手動でオフセットする必要がありますか?

4

1 に答える 1

8

うん。Time.new特定のタイムゾーンがない場合はパラメータを現地時間として解釈し、特定のタイムゾーンがDateTime.newない場合はパラメータをUTCとして解釈します。文書化されているように。コード全体を明確にTime.newするために、に置き換えることをお勧めします。Time.local

できることは、DateTimeミックスインをTime使用してを呼び出すことTime.local(2012,12,25).to_datetimeです。ただし、年/月/日がユーザー/ブラウザーからのものである場合は、サーバーを使用する代わりに、ユーザー/ブラウザーのタイムゾーンを取得する必要があります。

DB内の既存のデータを修正するために移行を作成する必要がある場合は、new_date_time = Time.local(old_date_time.year, old_date_time.mon, old_date_time.mday, old_date_time.hour, old_date_time.min, old_date_time.sec).to_datetime

于 2012-11-12T04:40:33.560 に答える