我的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日期对象?
首先验证您的数据是否成功地进行了往返:
event.created_at = Time.now.utc
event.date = ...whatever...
tmp_created_at = event.created_at
tmp_date = event.date
event.save
event.reload!
tmp_created_at == event.created_at or raise "created_at failed"
tmp_date == event.date_at or raise "date failed"
第二,验证JSON是否准确。
- 将JSON时间字符串与预期时间进行比较
- JSON TIME String具有-08:00
- JSON字符串是相同的实际时间吗?
- 例如,如果您期望10:00z,JSON显示02:00-08:00(即相同的实际时间)或10:00-08:00(不是相同的实际时间 - 这是八个几个小时后)。
如果数据往返工作正常,而JSON是相同的实际时间,请查看您要打印字符串的任何JSON库。寻找一种将以标准UTC格式打印时间的" ISO8601"的方法。
另外,知道Postgres默认情况下保存没有时区的时间戳可能会有所帮助。
" SQL标准要求编写时间戳等同于没有时区的时间戳,并尊重PostgreSQL的行为。(在7.3之前释放为时间戳记,将其视为时间戳记。区域;这是一个postgresql扩展。"
您可以通过描述表格,看起来像这样:
# d events
Table "public.events"
Column | Type | Modifiers
-----------+-----------------------------+-----------------------------------
id | integer | not null default
name | character varying(255) |
created_at | timestamp without time zone | not null
updated_at | timestamp without time zone | not null
date | timestamp with time zone | not null
更多基于OP的反馈的信息...
op说:我正在使用datamapper,在他们的网站上进行挖掘后,我发现"时间属性将始终存储并检索到dataStore设置为"设置为"的时区,并链接到GEM,该链接会强制特定的特定区域。
因为往返显示问题,请尝试使用连接库的当前版本,例如当前的datamapper,还可以尝试任何类似库的当前版本,例如ActiverEcord(在撰写本文时版本3.2.8)。