5

脚步:

在我的本地主机服务器上,我在位于太平洋时区的浏览器中选择时间 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:00 GMT-0800 (PST)

2013-01-18 18:00:00 UTC

输出 Heroku(生产):

2013 年 1 月 18 日星期五 10:00:00 GMT-0800 (PST)

2013-01-18 10:00:00 UTC

架构:

 t.datetime "starts_at"

环境:

Ruby on Rails 3.2.11

红宝石 1.9.3

Postgres

4

2 回答 2

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 issue 也讨论了它:

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

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

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

config.active_record.default_timezone = :utc
于 2013-01-19T22:46:55.003 回答
0

@slm 的解决方案config.active_record.default_timezone = :utc对我不起作用。Rails 仍在 Heroku 上使用本地编写和使用 UTC 阅读。

所以我然后尝试:

config.time_zone = 'Sydney'
config.active_record.default_timezone = :local

它在开发中仍然可以正常工作,但导致日期时间值现在以 UTC 格式从 Heroku 上的 postgres 读取。

我的临时解决方案是在 Heroku 上设置默认时区:

heroku config:add TZ="Australia/Sydney"

这只是一个临时解决方案,因为我希望我的应用程序使用 UTC。我已发布到@slm 提到的 rails/github 问题以进行澄清。当我找到更具体的解决方案时,我会更新我的答案。

于 2013-08-05T00:15:20.117 回答