模型的日期时间字段与本地主机在 heroku 上的存储方式不同

Joh*_*ohn 5 postgresql timezone ruby-on-rails heroku ruby-on-rails-3.2

脚步:

在我的本地主机服务器上,我在位于太平洋时区的浏览器中选择时间 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
Run Code Online (Sandbox Code Playgroud)

输出本地主机:

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"
Run Code Online (Sandbox Code Playgroud)

环境:

Ruby on Rails 3.2.11

红宝石 1.9.3

Postgres

slm*_*slm 3

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

我认为另一个问题的答案涵盖了您的问题:

具体这个答案:

使用以下格式查询时间UTC

SELECT * FROM tbl WHERE time_col > (now() AT TIME ZONE 'UTC')::time
Run Code Online (Sandbox Code Playgroud)

使用此查询获取本地时区的时间:

SELECT * FROM tbl WHERE time_col > now()::time
Run Code Online (Sandbox Code Playgroud)

Rails 和 ActiveRecords 以及日期/时间

这个rails/rails github问题也讨论了它:

Pixeltrix有一条评论,内容如下:

@deathbob 对于迟到的回复感到抱歉 - config.active_record.default_timezone 可接受的值是 :utc 或 :local。如果您将其设置为 :utc 以外的其他内容,它将假定为 :local 所以您看到的是预期的行为。

要修复时间以便ActiveRecords始终处理它,UTC您可以设置以下变量:

config.active_record.default_timezone = :utc
Run Code Online (Sandbox Code Playgroud)