Model的datetime字段以不同方式存储在localoku上

时间:2013-01-10 07:11:35

标签: ruby-on-rails postgresql heroku timezone ruby-on-rails-3.2

步骤:

在我的本地主机服务器上,我选择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

2 个答案:

答案 0 :(得分:3)

关于PostgreSQL如何处理日期/时间的背景

我认为你的问题在另一个SO问题的答案中有所涉及:

特别是这个答案:

将此查询用于UTC格式的时间:

SELECT * FROM tbl WHERE time_col > (now() AT TIME ZONE 'UTC')::time

将此查询用于本地时区的时间:

SELECT * FROM tbl WHERE time_col > now()::time

Rails& ActiveRecords&日期/时间

这个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问题以供澄清。当我找到更具体的解决方案时,我会更新我的答案。