0

通常我的 webapp 中有日期时间字段,这些字段由 Rails 作为 UTC 时间存储在 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字段是 adate并且它将存储在 postgresql 中,可能会提前或落后当地时间 1 天。当我去显示那个日期时,它不会转换为本地时间,这是有道理的......如果我没有存储时间,Ruby/Rails 怎么知道它是本地的哪一天?

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

我正在使用最新的稳定 Rails(现在是 3.2.9)

4

2 回答 2

0

尝试将 use_zone 与区域一起使用。

Time.use_zone(zone) do
   log.at = DateTime.parse(params[:at])
 end
于 2012-12-20T21:03:24.907 回答
0

给定 UTC 的时间戳:began_at,比如凌晨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's :at。现在一共

Log.create(at: Time.zone.parse(began_at.to_s).to_date, student_id: student_id)
于 2012-12-20T21:05:40.627 回答