步骤:
在我的本地主机服务器上,我选择2013年1月18日上午10点 - 上午11点在我位于太平洋时区的浏览器中。然后我在heroku上的生产服务器上选择完全相同的时间。
正如您所看到的,保存到数据库的内容的输出是不同的。我希望生产行为与localhost一样,并在将时间存储为UTC时考虑时区。是什么造成的? heroku服务器位于EST中,但这并未考虑此行为。
控制器:
def create
puts params[:event][:starts_at]
@event = Event.create!(params[:event])
puts @event.starts_at
end
输出Localhost:
2013年1月18日星期五10:00:00 GMT-0800(太平洋标准时间)
2013-01-18 18:00:00 UTC
输出Heroku(制作):
2013年1月18日星期五10:00:00 GMT-0800(太平洋标准时间)
2013-01-18 10:00:00 UTC
架构:
t.datetime "starts_at"
ENV:
Ruby on Rails 3.2.11
Ruby 1.9.3
的Postgres
答案 0 :(得分:3)
我认为你的问题在另一个SO问题的答案中有所涉及:
特别是这个答案:
将此查询用于UTC
格式的时间:
SELECT * FROM tbl WHERE time_col > (now() AT TIME ZONE 'UTC')::time
将此查询用于本地时区的时间:
SELECT * FROM tbl WHERE time_col > now()::time
这个rails/rails github问题也讨论了它:
pixeltrix有一条评论说明如下:
@deathbob对于迟到的回复感到抱歉 - 接受的值 config.active_record.default_timezone是:utc或:local。如果 你把它设置为以下的东西:utc它将假设:本地所以 你看到的是预期的行为。
要在ActiveRecords
中修复时间,以便始终将其作为UTC
处理,您可以设置以下变量:
config.active_record.default_timezone = :utc
答案 1 :(得分:0)
config.active_record.default_timezone = :utc
的@slm解决方案对我不起作用。 Rails还在本地写作,并在Heroku上用UTC阅读。
所以我接着尝试了:
config.time_zone = 'Sydney'
config.active_record.default_timezone = :local
在开发过程中仍然可以正常工作,但现在可以从Heroku上的postgres以UTC格式读取日期时间值。
我的临时解决方法是在Heroku上设置默认时区:
heroku config:add TZ="Australia/Sydney"
这只是一个临时解决方案,因为我希望我的应用程序使用UTC。我已经发布了@slm提到的rails / github问题以供澄清。当我找到更具体的解决方案时,我会更新我的答案。