通常我的webapp中有datetime字段,它们作为UTC时间由Rails存储在postgresql数据库中。当我在网页上显示这些日期和时间时,它们会在当地时间显示,因为我有类似下面的代码:
before_filter :set_time_zone
def set_time_zone
Time.zone = "Pacific Time (US & Canada)"
end
效果很好,除了现在我需要将一些datetime
字段转换为数据库中的date
字段(这很重要)。例如,我可能会有学生开始的日期记录:
Log.create(at: began_at, student_id: student_id)
began_at
是datetime
字段。我正确地设置Time.zone并不重要,at
字段是date
并且它将存储在postgresql中,可能在当前时间提前1天或之后。当我去显示那个日期时,它不会被转换为当地时间,这是有意义的......如果我没有存储时间,Ruby / Rails如何知道它在当地的哪一天?
我需要的是存储本地日期。因此,我需要将began_at
转换为本地时间,然后再将其分配给at
。在Rails中的控制器中执行此操作的正确方法是什么?
我正在使用最新的稳定Rails(现在是3.2.9)
答案 0 :(得分:0)
尝试将use_zone与区域一起使用。
Time.use_zone(zone) do
log.at = DateTime.parse(params[:at])
end
答案 1 :(得分:0)
给定:began_at
的UTC时间戳,比如凌晨1点左右
[1] pry(main)> Time.zone.now.utc.midnight + 1.hour
=> 2012-12-20 01:00:00 UTC
这可以转换为当地时间
[2] pry(main)> Time.zone.name
=> "Eastern Time (US & Canada)"
使用Time.parse(str)
[3] pry(main)> x = Time.zone.now.utc.midnight + 1.hour
=> 2012-12-20 01:00:00 UTC
[4] pry(main)> Time.zone.parse(x.to_s)
=> Wed, 19 Dec 2012 20:00:00 EST -05:00
然后,您可以使用.to_date
[5] pry(main)> Time.zone.parse(x.to_s).to_date
=> Wed, 19 Dec 201
然后您可以使用Log
设置:at
。现在总是
Log.create(at: Time.zone.parse(began_at.to_s).to_date, student_id: student_id)