【问题标题】:Rails Postgres Time Zone HandlingRails Postgres 时区处理
【发布时间】:2012-02-16 09:19:51
【问题描述】:

我想要的简单的事情是在数据库中以 UTC 格式存储 DateTime 并再次以 UTC 格式检索它,但 rails 似乎假设我将 DateTime 存储在本地时区并添加 8 小时差 (PST)。我的模型中有一个 DateTime 字段。如果我发送请求 (PUT) 以更新模型的特定实例中的此字段,不知何故时区会因某种原因而混淆:

通过 PUT 发送到 rails:2012-02-17T03:46:58Z

通过后续 GET 返回:2012-02-17T11:46:58Z

时差正好是 8 小时,可以用我的时区 PST (-08:00) 来解释。

我在 Rails 3.1.3 上使用 Datamapper 1.2。

我将我的应用程序配置时区明确设置为 UTC。

我也尝试使用 dm-zone-types。对我没有任何改变。

我的 repo 上的 git-bisect 显示,当我将数据库从原始 sqlite 切换到 postgres 时,引入了这种不当行为。此提交仅更改了 database.yml 和 gemfile。没有别的了。

有什么想法吗?

【问题讨论】:

  • 我遇到了完全相同的问题(现在使用“dm-zone-types”)。我在 Sinatra 上,使用 Datamapper 1.2 和 dm-zone-types 0.3。时间似乎存储为 UTC(根据 zoned_time.rb 中“dump”方法的返回值),但在检索到它之后,时区是我的本地时区,时间错误。 POST:2012-02-16 11:25:52 +0100,“CET”数据库中的值:2012-02-16 10:25:52 +0000,“UTC”GET:2012-02-16 10:25:52 +0100, "CET"
  • 您查看过您的 Postgres 数据库并了解您的日期时间字段的原始数据库值是多少?
  • 数据库中的原始值为“2012-02-17 03:46:58”。那是 UTC 时间和我想收到的值。在从数据库中提取值并将其发送到客户端之间的某个地方,rails 似乎做了一些我不太理解的诡计。感谢您的意见!
  • 我想我通过将环境变量 TZ 设置为 UTC [1] 来修复它。但是我发现这个解决方案相当老套,使用起来感觉很脏,特别是因为这是一个不容易放入版本控制的配置。有更好的主意吗?
  • 您是否尝试过设置 Time.zone = 'UTC'?这与您说您设置的配置值不同,该值仅用于存储在数据库中的方式。

标签: ruby-on-rails postgresql timezone datamapper dm


【解决方案1】:

我自己找到了一个 hacky 解决方案:

将环境变量 TZ 中的服务器时区设置为“UTC”。为了持久化这个配置选项,我决定把环境变量设置放在 config/boot.rb 中:

ENV['TZ'] = "UTC"

我仍然觉得很脏,这个解决方案仍然让我感到很不舒服。因此,我们非常感谢任何更好/更清洁的解决方案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2015-12-03
    • 2019-01-08
    • 2017-04-09
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多