【发布时间】:2012-10-30 09:24:54
【问题描述】:
我的 Sinatra 应用正在创建一个简单的对象并将其持久化到 Postgres:
post '/' do
event = Event.new(params)
event.created_at = Time.now.utc
event.date = next_date(params[:dayofweek], params[:time]) if params[:dayofweek] && params[:time]
if event.save
status 201
event.to_json
else
json_status 400, event.errors.to_hash
end
def next_date(dayofweek, hour)
...
# some calculations that effectively culminate in the final line below
...
my_time = Time.utc(2012, 11, 9, 12, 0, 0) ## => 2012-11-09 12:00:00 UTC
end
对象保存成功。但是当我从development 环境中检索对象时,我得到(json):
{ ..., "date":"2012-11-23T20:00:00-08:00" } #notice the PST offset of -08:00.
我期待 UTC 时区或 +00:00。出于某种原因,我在 PST 中的开发工作站在保存到 Postgres 时会考虑自己的时区……至少它看起来在做什么?!?
将相同的代码发送到生产服务器 (Heroku) 存储相同的数据,并具有适当的偏移量 +00:00
如何让我的开发工作站像生产工作站一样工作?或者,我应该如何在 Sinatra 中创建正确的 UTC Date 对象?
【问题讨论】:
-
@joelparkerhenderson 下面给出了很好的答案,但不要忘记检查您用来连接数据库的库(我假设您使用的是 AR 或 Sequel 或其他东西)这也会产生影响。
-
谢谢,您的评论让我找到了可能的解决方案,尽管我还没有测试过。我正在使用 DataMapper,在他们的网站上四处挖掘后,我发现"time properties will always be stored and retrieved in the timezone the datastore is set to" 和link to a gem 将强制一个特定区域。 如果你想把它变成一个答案,我会把复选标记扔给你。
-
所以,在尝试了这颗宝石之后,它首先是 2 岁!?!并且似乎不起作用...它将日期设置为某种非 ISO 格式
"2012-11-13 10:00:00 -0800"并将 UTC 偏移量保持为 PST (-08:00)。所以,我不知道该怎么办!?!这很奇怪,因为我一直认为所有数据通常都应该以 UTC 格式保存。但是 DataMapper 故意让这变得困难。 这是我第一个使用 Sinatra 的应用程序。我一定做错了什么?!?我应该切换到 ActiveRecord 吗? -
我会等到它修好,然后我觉得我已经做了一些值得勾选的事情:) 试试这两件事 1) 在 Postgres 中,
SET timezone TO 'UTC'; select current_setting('timezone');2) 将 TZ 环境变量设置为 ' UTC',尝试TZ=UTC ruby my_sinatra_app.rb看看是否有效,如果有效,则在 rackup 文件或 Sinatra 配置块中设置 env var。 -
是的,从 DataMapper 切换到 ActiveRecord。
标签: ruby datetime timezone sinatra datamapper