【问题标题】:Model's datetime field is stored differently on heroku from localhost模型的 datetime 字段在 heroku 上与 localhost 的存储方式不同
【发布时间】:2012-12-24 12:36:01
【问题描述】:

步骤:

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

Ruby 1.9.3

Postgres

【问题讨论】:

  • config/application.rb 中的时区配置是什么?
  • @ThongKuah 我把它注释掉了,cmets 说这意味着它是 UTC,因为它默认是 UTC。
  • 嘿,约翰,这是否与 stackoverflow.com/questions/2719330/… 有某种关系?我以前见过 Heroku 出现奇怪的 tz 问题。
  • @Saran 该答案的解决方案不走运。它似乎与记录时间有关。
  • @John 在 Heroku 和 localhost 中运行 \d your_table ?您是否有没有时区的时间戳作为您的 postgres 日期类型?

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


【解决方案1】:

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 以外的其他值,它将假定为 :local 那又如何 你看到的是预期的行为。

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

config.active_record.default_timezone = :utc

【讨论】:

  • 对不起,我出城了,直到现在才知道。我认为您的答案是正确的,但我仍然有些困惑。有主动记录解决方案吗?我不使用续集。您提供的两个 SQL 查询是选择,但我最关心的是正确插入日期时间。谢谢!
  • config.active_record.default_timezone = :utc
【解决方案2】:

@slm of config.active_record.default_timezone = :utc 的解决方案对我不起作用。 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 问题以进行澄清。当我找到更具体的解决方案时,我会更新我的答案。

【讨论】:

    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2016-03-09
    • 2011-02-19
    相关资源
    最近更新 更多