2012-11-14 5 views
15

、と私は疑問だった:私の国でRailsの - 私は、このタイムゾーンの時刻が動作する方法を理解しようとした際のタイムゾーンと夏時間

今日、我々はGMT-2夏時間(であるが)。 私のアプリケーションのユーザーは、11:00 AMのような時間を入力し、フォームを投稿します。 私が知っている限り、レールはこの日付をUTCに変換し、データベース(私の場合はmysql)に保存します:01:00 PM UTC。

私はそのレコードを回復するとき、私は表示するために現地時間に変換しなければなりませんでした。 OK?

私の質問は、私の国が夏時間(GMT-3)から出てくる将来の日付/時刻を表しているとします。 Railsは午後1時00分を保存しますか?今日、夏時間では、現地時間はどのようになりますか?そして、将来、この現地時間はどのようになりますか?

基本的に、私はいつもユーザ11:00 AMを表示する必要があります。

ありがとうございました。

答えて

2

あなたが尋ねた後7ヶ月ですが、おそらくskip_time_zone_conversion_for_attributes =が役立ちます - ARはストレージまたは検索時にタイムゾーンを変換しないようにARに指示します。

class Topic < ActiveRecord::Base 
    self.skip_time_zone_conversion_for_attributes = [:written_on] 
end 

--Kip

13

オペレーティングシステム(またはおそらくユーザーアカウント)のデフォルト設定、データベースサーバー、Rails environment.rbは、タイムゾーンが再生できる場所がいくつかあります。

重要なのは、すべての日付がで、のUTCタイムゾーンが格納されていることを確認してから、ローカルタイムゾーンが何であっても表示されます。あなたがそうしているように聞こえる。

あなたの質問は「夏時間の場合は-3時間、それ以外の場合は-2時間のオフセットが必要です」と沸騰するようです。 Railsタイムエクステンションは、現在のオフセットをTime.zone.now.utc_offsetのように決定し、Time#dst?は、それらの2つの夏時間が条件付きで余分な時間(3600秒)を減算できるかどうかを知らせます。

+1

だから、それは常に、ディスプレイの質問です:例を示している[ActiveRecordのタイムスタンプ](http://api.rubyonrails.org/classes/ActiveRecord/Timestamp.html)を参照してください。この場合、フィルタパラメータに渡されるすべての日付値をUTCに変換する必要があります。 – Beetlejuice

+1

それは考え方が正しいですが、「表示された」という言葉の選択は役に立たないかもしれません。私は数週間前にパートナーが午前2時に仕事をした場所(DSTのオフセットにかかわらず)を持っていました。つまり、それを調整する必要がありました。実際には、タイムゾーンが含まれている限り、*のタイムゾーンには日付が格納されていても問題ありません。*自分のタイムゾーンと保存されている日付を知っていれば、時間を調整して表示するために必要なものがすべてありますしかし、あなたが必要です。 UTC(システムをUTCに設定)として日付を保存するだけで、すべての作業が簡単になります。 –

+0

さて、今私たちはDSTに入っており、現地時間で午前8時にレコードを保存することになります。これは、10am utcをデータベースに保存します。もう一つの手で、今は普通の時間だと思って、現地時間の午前8時にレコードを保存し、データベースに11am utcを保存します。両方のレコードをユーザーに8時に表示することはできません。さて、すべてをUTCに設定すればうまくいくでしょう。 – Beetlejuice

関連する問題