在Heroku上的Rails中修复数据库的时区问题

时间:2016-11-05 20:02:59

标签: ruby-on-rails heroku

My Rails应用程序托管在Heroku上,带有Postgress数据库。对于某个型号,我要求用户选择一天和一个时间,我在保存模型之前将其合并为一个日期:

  def create_timestamp
    self.date = day.to_datetime + time.seconds_since_midnight.seconds
  end

当我今天选择@ 20:50:00并将其存储在数据库中时,我的记录如下:

<Report id: 1, account_id: 1, date: "2016-11-05 20:50:00", description: "test", created_at: "2016-11-05 19:50:57", updated_at: "2016-11-05 19:50:57", deleted_at: nil, user_id: 1, report_category_id: 2, time: "2000-01-01 20:50:00", day: "2016-11-05">

您可能会注意到,created_at日期不同,因为它位于不同的时区。虽然created_at存储在UTC +0000中,但我使用本地时区的自定义日期为CET +0100。

所以当我输入控制台:Report.find(1).date时,它会返回2016-11-05 21:50:00 +0100。

如何在初始设置中存储正确的日期,或者在查询时让数据库返回正确的时区?

由于

2 个答案:

答案 0 :(得分:1)

您目前正在做的事情基本上是这样的:

>> date = Date.new(2016, 11, 6)
=> Sun, 06 Nov 2016
>> time = Time.new(2000, 1, 1, 20, 50, 0)
=> 2000-01-01 20:50:00 +0100
>> date.to_datetime + time.seconds_since_midnight.seconds
=> Sun, 06 Nov 2016 20:50:00 +0000

to_datetime在该日期将无时区的Date转换为代表午夜UTC DateTime,然后再添加20小时50分钟

而不是午夜UTC,您希望在当地时区午夜作为起点。所以你可以这样做,例如:

>> date.in_time_zone + time.seconds_since_midnight.seconds
=> Sun, 06 Nov 2016 20:50:00 CET +01:00

Rails应该足够智能,可以在存储到数据库时将其转换为UTC,并在从数据库中检索时返回到CET。

要清楚区别,请比较:

>> date
=> Sun, 06 Nov 2016
>> date.to_datetime
=> Sun, 06 Nov 2016 00:00:00 +0000
>> date.in_time_zone
=> Sun, 06 Nov 2016 00:00:00 CET +01:00

答案 1 :(得分:0)

你应该使用

Time.zone.now
# or 
Time.current

将返回时区中的时间