Пользовательское поле отметки времени не может быть изменено в рельсах

Недавно я добавил в свою базу данных столбец с именем created_at_user_time (изначально не имел значения), который должен содержать отметку времени created_at, преобразованную в часовой пояс. Я сделал быстрый скрипт, который должен был делать преобразования и сохранять их в новой колонке. Однако после того, как я закончил, я заметил, что исходные временные метки были только что скопированы в новые. Я решил исследовать в консоли рельсов и получил следующее.

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 

У кого-нибудь есть идеи, как это сделать правильно?


person SomberClock    schedule 03.02.2013    source источник


Ответы (2)


Я бы сказал, что это вернется в то же время, но с другим часовым поясом, но в конце это будет до той же метки времени:

newstamp = test.created_at.in_time_zone
person MiGro    schedule 03.02.2013
comment
Вы знаете, как мне на самом деле это сделать? - person SomberClock; 04.02.2013
comment
Чем бы Вы хотели заняться? - person MiGro; 04.02.2013
comment
Сохраните преобразованную временную метку в базу данных - person SomberClock; 04.02.2013
comment
но дата, которую вы пытаетесь сохранить, точно такая же... Среда, 02 января 2013 г. 02:02:54 UTC +00:00 === Вт, 01 января 2013 г. 20:02:54 CST -06:00. Дело только в презентации... - person MiGro; 04.02.2013
comment
Мне нужно сохранить их в этом состоянии, чтобы позже правильно сгруппировать их по дате stackoverflow.com/questions/14412360/. Если дата окажется другой, это не сработает. - person SomberClock; 04.02.2013
comment
сгруппировать по двум атрибутам timestamp и timezone или добавить еще один столбец в виде строки... - person MiGro; 04.02.2013

Как указал MiGro, простое использование метода .in_time_zone просто меняет способ отображения временной метки в тексте и фактически не меняет значение. Чтобы изменить значение, я получаю смещение от преобразованного значения времени и добавляю его к исходному времени, что дает мне возможность группировать заказы (см. мой предыдущий вопрос Изменить created_at в запросе перед группировкой по дате) на правильную дату.

 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
person SomberClock    schedule 13.03.2013