步骤:
在本地主机服务器上,我在位于太平洋时区的浏览器中选择2013年1月18日上午10时至上午11时。然后在heroku上的生产服务器上选择完全相同的时间。
如您所见,保存到数据库的输出是不同的。我希望生产作为本地主机运行,并在以UTC的形式存储时间时考虑到时区。是什么引起的?heroku服务器位于EST中,但这并不能解释这种行为。
控制器:
def create
puts params[:event][:starts_at]
@event = Event.create!(params[:event])
puts @event.starts_at
end输出本地主机:
2013年1月18日星期五10:00格林尼治时间-0800(太平洋标准时间) 2013-01-18 :00世界协调世界时
输出Heroku (生产):
2013年1月18日星期五10:00格林尼治时间-0800(太平洋标准时间) 2013-01-18 10:00世界协调世界时
模式:
t.datetime "starts_at"环境:
3.2.11
Ruby 1.9.3
波斯特格斯
发布于 2013-01-19 22:46:55
PostgreSQL如何处理日期/时间的背景知识
我认为你的问题已从另一个如此问题的回答中涉及到:
具体来说,这个答案是:
使用UTC格式的时间查询:
SELECT * FROM tbl WHERE time_col > (now() AT TIME ZONE 'UTC')::time在本地时区中使用此时间查询:
SELECT * FROM tbl WHERE time_col > now()::timeRails & ActiveRecords &日期/时间
这个rails/rails github问题也讨论了它:
象素的评论如下:
@deathbob对延迟回复表示歉意- config.active_record.default_timezone的接受值要么是:utc,要么是:local。如果您将其设置为:utc以外的其他内容,它将假设:本地,所以您看到的是预期的行为。
要在ActiveRecords中修正时间以便始终将其处理为UTC,您可以设置以下变量:
config.active_record.default_timezone = :utc发布于 2013-08-05 00:15:20
@slm of config.active_record.default_timezone = :utc的解决方案对我没有用。Rails仍在用本地语言写作,在Heroku上与UTC一起阅读。
于是我试着:
config.time_zone = 'Sydney'
config.active_record.default_timezone = :local它在开发过程中仍然运行良好,但导致了从Heroku上的postgres以UTC格式读取datetime值。
我的临时解决方案是将Heroku上的默认时区设置为:
heroku config:add TZ="Australia/Sydney"这只是一个临时的解决方案,因为我希望我的应用程序使用UTC。我已经在rails/github上发布了@slm提到的问题,以求澄清。当我找到更具体的解决方案时,我会更新我的答案。
https://stackoverflow.com/questions/14252579
复制相似问题