【发布时间】: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