2009-06-01 19 views
5

私はRails 2.3アプリケーションをタイムゾーンを正しく処理するように変換しています(現時点ではすべてがUTCで正しくありませんが、です)! )。RailsアプリケーションのMySQL DBに日付を正しく格納する

私はenvironment.rbにでこれらの設定を持っている:

config.active_record.default_timezone = :utc 
config.time_zone = "UTC" 

は、私はタイムゾーンを設定するには、次の設定を行うことを計画我々のアプリ内の各リクエストに応じて、今後:

Time.zone = user.time_zone 

user.time_zoneが選択されたものです(例:US Pacific Time)。

これはアプリで問題なく動作しますが、私の質問はMySQLデータベースにどのようなRailsが格納されているのかと関係しています。ユーザーが2009年6月1日の日付を選択すると、データベースのDATETIMEフィールドにUTCで格納されますが、のタイムゾーンオフセットが格納されます。たとえば、ユーザーがGMT+6タイムゾーンを選択した場合、2009年6月1日の選択日付はデータベースで2009-06-01 06:00:00 UTCとなります。

これは、データベースに2009-06-01 00:00:00 UTCとして保存されると予想されます。私の考えは正しいのですか、ここで予期せぬことをしているRailsですか?

+0

ユーザーのタイムゾーンに日付を表​​示するだけでいいですか、それともそのタイムゾーンに具体的に保存することは重要ですか? –

+0

Chris 私はUTCで保存し、ユーザーのタイムゾーンに日付を表​​示したい – Olly

答えて

4

のRails 2.1 +で扱うネイティブのタイムゾーンについてこのブログ記事会談:

http://mad.ly/2008/04/09/rails-21-time-zone-support-an-overview/

要旨はRailsはUTCでDB内のすべてのレコードを格納し、表示するためのユーザーのタイムゾーンに変換されるということですが。それは意味があります:すべてのデータを中立の形式で保存し、最後の1分に目的の形式に変換します。

0

日付を設定する前に、データオブジェクトにタイムゾーンを設定する必要があります。

1

私のコメントに対するあなたの回答に基づいて、ローカルサーバー時間に基づいて日付を保存し、JavaScriptのDate :: toLocaleString()を使用してローカルタイムゾーンに変換するといいでしょう。私は数年前に記事を書いています。それはhereです。

記事のJSはMooToolsで書かれましたが、私はjQueryで書き直しましたので、そのコードを示します。

重要な部品:

HTMLをレンダリングする場合、エポックからのミリ秒を使用します。

次のように定義されたモデル内のメソッドが必要です
<span class="dt"><!-- <%= blah.created_at_epoch_ms %> --><%= blah.created_at %></span> 

:日付を変換するために

def created_at_epoch_ms 
    self.created_at.to_i * 1000 
end 

JS:これは、ユーザーのローカル時間に文字列を変換する必要があり

$(document).ready(function(){ 
     $('span.dt').each(function(){ 
       var date = new Date(); 

       date.setTime(this.firstChild.data); 

       $(this).parent().text(date.toLocaleString()); 
     }); 
}); 

を、マジックはtoLocaleString()で発生します。私が聞いたことがある唯一のブラウザではSafari 2.0が実装されていません。ほとんどのユーザーが移動したと思いますので、問題はほとんどありません。

my siteでこのメソッドを使用しています。ページのソースコードを見ると、その内容を確認できます。

彼らはJSが有効になっている場合、それはの値を取るよ

Wednesday, May 27, 2009 11:22:01 PM 

に私のブラウザ(中部標準時)に変換され

<!-- 1243484521000 -->2009-05-28 04:22:01 UTC 

:ブラウザに送信されます実際のコードは次のようになりますそれを変換し、文字列全体(UTC時間を含む)を現地時間に置き換えます。 JSが無効になっている場合、JSはサーバーに表示される時刻を表示します。

関連する問題