Sinatra/Ruby 时区开发和生产之间的麻烦



我的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)。

相关内容

  • 没有找到相关文章

最新更新