2013-02-03 54 views
0

我最近在我的數據庫中添加了一個名爲created_at_user_time(最初沒有值)的列,該列應該包含時區轉換的created_at時間戳。我製作了一個快速腳本,用於創建轉換並將其保存在新列中。然而,當我完成後,我注意到原來的時間戳剛剛被複制到新的時間戳中。我決定在rails console中進行調查,並得到以下結果。無法在導軌中更改自定義時間戳字段

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 

有沒有人有任何想法,如何正確地做到這一點?

回答

0

由於MIGRO指出的那樣,只是用.in_time_zone方法只是改變的方式時間戳以文本顯示,並且實際上不會更改該值。爲了更改該值,我從轉換後的時間值中獲得偏移量並將其添加到原始時間,從而使我能夠按照正確的日期對訂單進行分組(請參閱我的上一個問題Modify created_at in query 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 
1

我會說這將返回相同的時間,但有不同的時區,但它到底是直到相同的時間戳:

newstamp = test.created_at.in_time_zone 
+0

你我應該怎麼去做這件事? – SomberClock

+0

您想要做什麼? – MiGro

+0

將轉換後的時間戳保存到數據庫中 – SomberClock