1

私の 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 オブジェクトを作成するにはどうすればよいですか?

4

1 に答える 1

2

まず、データが正常に往復することを確認します。

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 時刻文字列には -08:00 があります
  • JSON文字列は実際の時間と同じですか?
  • たとえば、10:00Z を期待する場合、JSON は 02:00-08:00 (つまり、同じ実際の時間) または 10:00-08:00 (同じ実際の時間ではありません-これは 8 時間後です) を示しますか? .

データの往復が機能し、JSON が同じ実時間である場合は、文字列を出力するために使用している JSON ライブラリを調べます。標準の UTC 形式で時刻を出力する「iso8601」などのメソッドを探します。

また、Postgres はデフォルトでタイム ゾーンなしでタイムスタンプを保存することを知っておくと役立つ場合があります。

「SQL標準では、タイムスタンプのみをタイムゾーンなしのタイムスタンプと同等に記述する必要があり、PostgreSQLはその動作を尊重します。(7.3より前のリリースでは、タイムゾーン付きのタイムスタンプとして扱われました。)タイムスタンプ付きのタイムスタンプの省略形としてタイムスタンプtzが受け入れられます。これは、は 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 を使用しており、彼らのサイトを掘り下げた後、「時間プロパティは常にデータストアが設定されているタイムゾーンで保存および取得されます」と、特定のゾーンを強制する宝石へのリンクを見つけました。

往復で問題が発生するため、現在の DataMapper などの接続ライブラリの現在のバージョンを使用してみてください。また、ActiveRecord (この記事の執筆時点ではバージョン 3.2.8) などの同様のライブラリの現在のバージョンも試してください。

于 2012-11-10T04:15:18.163 に答える