自定义时间戳字段无法在rails中更改

时间:2013-02-03 21:07:44

标签: ruby-on-rails sqlite rails-activerecord

我最近在我的数据库中添加了一个名为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 

有没有人对如何正确地做到这一点有任何想法?

2 个答案:

答案 0 :(得分:1)

我会说这将返回相同的时间,但时区不同,但最后它会持续到同一时间戳:

newstamp = test.created_at.in_time_zone

答案 1 :(得分: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