0

created_at_user_time私は最近、タイムゾーン変換されたcreated_atタイムスタンプを保持することになっている(最初は値がありませんでした)という名前のデータベースに列を追加しました。変換を行い、新しい列に保存することになっている簡単なスクリプトを作成しました。しかし、作業を終えた後、元のタイム スタンプが新しいタイム スタンプにコピーされていることに気付きました。Railsコンソールで調査することにし、以下を得ました。

1.9.3p194 :002 > user.time_zone
=> "Central Time (US & Canada)"
1.9.3p194 :003 > test = user.orders.first
1.9.3p194 :004 > test.created_at
=> Wed, 02 Jan 2013 02:02:54 UTC +00:00 
1.9.3p194 :006 > newstamp = test.created_at.in_time_zone("#{user.time_zone}")
=> Tue, 01 Jan 2013 20:02:54 CST -06:00 
1.9.3p194 :008 > test.created_at_user_time = newstamp
=> Tue, 01 Jan 2013 20:02:54 CST -06:00 

#ok, now lets save and check it

1.9.3p194 :009 > test.save
(0.4ms)  begin transaction
(0.1ms)  commit transaction
=> true 


1.9.3p194 :010 > test = user.orders.first
1.9.3p194 :011 > test.created_at_user_time
=> Wed, 02 Jan 2013 02:02:54 UTC +00:00 

これを正しく行う方法について誰かアイデアがありますか?

4

2 に答える 2

1

これは同じ時間に返されますが、タイムゾーンが異なりますが、最後は同じタイムスタンプになります。

newstamp = test.created_at.in_time_zone
于 2013-02-03T21:16:15.173 に答える
0

MiGro が指摘したように、この.in_time_zoneメソッドを使用するだけで、タイムスタンプがテキストで表示される方法が変わるだけで、実際に値が変わるわけではありません。値を変更するために、変換された時間の値からオフセットを取得し、それを元の時間に追加して、正しい日付で注文をグループ化できるようにします (前の質問Modify created_at before grouping by date を参照)。

 test_order = user.order.first 
 orig_time = test_order.created_at
 conv_time = orig_time.in_time_zone(user.time_zone)
 offset = conv_time.utc_offset
 order.created_at_in_user_time = orig_time + offset
于 2013-03-13T07:55:09.777 に答える