2012-04-05 12 views
4

(Ruby MRI 1.9.2でRails 3.2.3を使用しています)Rails:データベースがUTC、Time.zone米国東部の場合、米国太平洋で時間を節約するにはどうすればよいですか?

すべてがUTCで中央に格納されています。これはいい。各ユーザーには「タイムゾーン」プロパティがあります。私のApplicationControllerには、ユーザの保存されたタイムゾーンにTime.zoneを調整するためのbeforeフィルタがあります。これも良いことです。

上記を踏まえて、私のUserが時間を使ってdatetimeを選択すると、その時間はTime.zoneになると予想され、Railsはこれを自動的に調整してUTCとして保存します。これも、良いです。

今すぐ:の時間を別のタイムゾーンに記入して、それをUTCとして保存することができます。しかし、Railsは(以前はApplicationControllerによって設定された)Time.zoneに記入された完了日時選択を期待しています。したがって、レールはUTC に正しく調整されます

第3のタイムゾーンに入力された時間を保存する目標をどのように達成できますか?

イラスト:

私の使用シナリオは、西海岸のホテルに属する文書の日付を調整フロリダでのユーザーです。彼らは西海岸のための時間を入力しようとしています。

私はスタイルのピッカーとスタイルのテキストボックスへのjQueryを使用していますので、私は、出力する方法にテキストボックスに文字列を持っている:これは完璧に働いている

<%= f.text_field(:created_at, :value => adjusted_to_hotel_time(@document.created_at), :class => 'text datetime_picker') %> 

def adjusted_to_hotel_time(time) 
    time.in_time_zone(@current_hotel.timezone).to_s(:admin_jquery) # formatted for the jQuery datetime_picker text fields. 
end 

が、Railsが間違ってUTCに調整@documentが保存されたとき。私は自分が知らないものを知らないのですが、そのフィールドに入力されたデータを@ current_hotel.timezoneに「タグ付け」すれば、親オブジェクトを保存するときにRailsがUTCに正しくオフセットされますか?

答えて

13

ひびが入った!

基本的に、paramsに送信される文字列は、ホテルのタイムゾーンの時間を表しています。私たちは組み込みの 'use_zone'メソッドを使用して、グローバルTime.zoneを一時的にそのホテルに設定する必要があります。

次に、UserではなくHotelのタイムゾーンを使用して、Railsが期待している値を生成するブロックをメソッドに渡します。つまり、UTCへのRailsの変換は、フォームに入力された時刻がUsersのタイムゾーンに変換されるため、db内の正しい時刻になります。オフセットは効果的に互いに打ち消し合っています。

@document.created_at = Time.use_zone(@current_hotel.timezone) {Time.zone.parse("#{params[:document][:created_at]}").in_time_zone(@current_hotel.timezone)} 

は、我々は基本的にTimeオブジェクトのタイムゾーンの変更の実際の時間を変換せずにここTimeオブジェクトのタイムゾーンを変更しています。(その文を構文解析して幸運を祈る!)

これは私のためにはうまくいくように見えますが、私はこれをあまりにも長く見てきました。これ以上の道を見たいと思っています。

+0

私はこれに関するQ&Aの不足を理解していない...私はこれを探して時間を費やした...確かにこれは一般的です???それとも文字通り、あなたはあなたがレールの外に出ていくクロスジオスにスケールしますか?うーん...これをやってくれてありがとう! – james

+0

うれしかった! – Daniel

2

datetimeカラムタイプには日付と時刻のみが格納されますが、タイムゾーンは格納されません。そこに保存されたUTC時間を解釈するために使用されるタイムゾーンを保存するために、セカンダリ列を作成する必要があります。

これら2つの値を組み合わせて、最初の入力を再作成することができます。

+0

私は推測しますが、私はタイムゾーンを保存する必要はありません。これは余分なオーバーヘッドであり、私はUTCを使用して満足しています。私は、Railsの内部に、「このデータは、私のグローバルTime.zoneとは異なるオフセットを使用しているので、UTCに別々に調整してください」ということを知りたいだけです。 – Daniel

+0

保存する前に 'in_time_zone'メソッドを使用して変換できますか? – tadman

+0

私は今実際にそのことを見ていますが、私のパラメータをTimeオブジェクトにマーシャリングするのに問題があります。 paramsオブジェクトの文字列にオフセットがなく、マーシャルしようとするたびに、新しくインスタンス化されたtimeオブジェクトがローカルマシンのタイムゾーンに基づいているため、in_time_zoneを使用しているコンバージョンは正しくありません。何か案は?! – Daniel

関連する問題