【问题标题】:Fix timezone issue with database in Rails on Heroku修复 Heroku 上 Rails 中数据库的时区问题
【发布时间】:2016-11-05 20:02:59
【问题描述】:

我的 Rails 应用托管在 Heroku 上,带有 Postgress 数据库。对于某个模型,我要求用户选择日期和时间,然后在保存模型之前将它们组合为日期:

  def create_timestamp
    self.date = day.to_datetime + time.seconds_since_midnight.seconds
  end

当我选择今天@20:50:00 并将其存储在数据库中时,我的记录如下所示:

<Report id: 1, account_id: 1, date: "2016-11-05 20:50:00", description: "test", created_at: "2016-11-05 19:50:57", updated_at: "2016-11-05 19:50:57", deleted_at: nil, user_id: 1, report_category_id: 2, time: "2000-01-01 20:50:00", day: "2016-11-05">

您可能会注意到,created_at 日期不同,因为它位于不同的时区。虽然 created_at 存储在 UTC +0000 中,但我使用本地时区的自定义日期是 CET +0100。

所以当我在控制台输入:Report.find(1).date 时,它会返回 2016-11-05 21:50:00 +0100。

如何在初始集合中存储正确的日期,或者让数据库在查询时返回正确的时区?

谢谢

【问题讨论】:

    标签: ruby-on-rails heroku


    【解决方案1】:

    你现在做的基本上是这样的:

    >> date = Date.new(2016, 11, 6)
    => Sun, 06 Nov 2016
    >> time = Time.new(2000, 1, 1, 20, 50, 0)
    => 2000-01-01 20:50:00 +0100
    >> date.to_datetime + time.seconds_since_midnight.seconds
    => Sun, 06 Nov 2016 20:50:00 +0000
    

    to_datetime 将无时区的 Date 转换为代表该日期午夜 UTCDateTime,然后添加 20 小时 50 分钟。

    您希望您当地时区的午夜作为您的起点,而不是 UTC 午夜。所以你可以这样做,例如:

    >> date.in_time_zone + time.seconds_since_midnight.seconds
    => Sun, 06 Nov 2016 20:50:00 CET +01:00
    

    Rails 应该足够聪明,以便在存储到数据库时将其转换为 UTC,并在从数据库中检索时将其转换回 CET。

    要清楚区别,请比较:

    >> date
    => Sun, 06 Nov 2016
    >> date.to_datetime
    => Sun, 06 Nov 2016 00:00:00 +0000
    >> date.in_time_zone
    => Sun, 06 Nov 2016 00:00:00 CET +01:00
    

    【讨论】:

      【解决方案2】:

      你应该使用

      Time.zone.now
      # or 
      Time.current
      

      返回时区时间

      【讨论】:

      • 我正在尝试处理用户输入,这可能与当前时间不同。不过感谢您的回复。
      猜你喜欢
      • 2017-07-14
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2012-02-27
      • 2019-11-24
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多