转换为Rails中Date字段的本地时间

时间:2012-12-20 20:16:46

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 rails-i18n

通常我的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_atdatetime字段。我正确地设置Time.zone并不重要,at字段是date并且它将存储在postgresql中,可能在当前时间提前1天或之后。当我去显示那个日期时,它不会被转换为当地时间,这是有意义的......如果我没有存储时间,Ruby / Rails如何知道它在当地的哪一天?

我需要的是存储本地日期。因此,我需要将began_at转换为本地时间,然后再将其分配给at。在Rails中的控制器中执行此操作的正确方法是什么?

我正在使用最新的稳定Rai​​ls(现在是3.2.9)

2 个答案:

答案 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)