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。
如何在初始设置中存储正确的日期,或者在查询时让数据库返回正确的时区?
由于
答案 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
将返回时区中的时间