2012-02-16 180 views
1

我想要的简单事情是在数据库中以UTC存储DateTime,并再次以UTC检索它,但Rails似乎假定我将DateTime存储在本地时区中,并添加了8小时差(太平洋标准时间)。我的模型中有一个DateTime字段。如果我发送一个请求(PUT)在我的模型的特定实例来更新这个字段,不知何故时区弄混无论出于何种原因:Rails Postgres时区处理

通过PUT发送到轨道: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。没有改变我的任何事情。

我的回购库上的一个git-bisect显示,当我将数据库从原始sqlite切换到postgres时引入了这种不当行为。这个提交只改变了database.yml和gemfile。没有其他的。

任何想法?

+0

你看过你的Postgres数据库,看到你的日期时间字段的原始数据库值是什么? – 2012-02-16 10:59:57

+0

我有完全相同的问题(现在使用'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” – 2012-02-16 10:51:07

+0

数据库中的原始值是“2012-02-17 03:46:58”。这是UTC时间和我希望收到的价值。在从数据库中提取价值并将其发送到客户端之间的某处,rails似乎做了一些我不明白的欺骗行为。感谢您的输入! – kaihowl 2012-02-16 16:22:39

回答

2

我已经找到了解决办法哈克自己:

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

ENV['TZ'] = "UTC" 

我还是觉得肮脏,该解决方案还让我心惊肉跳。因此,任何更好/更清洁的解决方案都非常感谢