2

created_atモデルで、モデルをレンダリングするときの属性jsonが次のような形式になっていることに気付きました。

2013-05-20T22:12:31Z

を呼び出しTime.nowてレンダリングするとjson、次のような形式になります。

2013-05-21 00:04:03 +0000

iOS現在の時刻と作成された時刻を比較する必要があるアプリ用の Web サービスを作成しようとしていますが、タイムゾーンの違いのために比較できません。

属性の は何を表しZていますか? Created_atそれはタイムゾーンですか?Time.nowもしそうなら、タイムゾーンを一致するように変更するにはどうすればよいですか?

Zタイムゾーンでない場合、推奨事項はありますか?

4

1 に答える 1

5

ActiveRecord タイムスタンプ列 (created_at や updated_at など) はActiveSupport::TimeWithZone型としてロードされますが、Time.now はTimeを生成します。これらのクラスには異なるデフォルトの to_s 形式があり、これが矛盾を説明しています。

ご想像のとおり、Z と +0000 は両方とも日時のタイムゾーンに関連しています。created at 値は、ISO 8601日付として表されます。Z は、UTC または GMT 0 オフセット タイムゾーンを表す別の方法である Zulu を意味します。良いニュースは、両方の日付がすでに UTC になっているということです。

ユースケースが何であるかはわかりませんが、可能であれば、iOS クライアントではなくサーバーでこの日付比較を行うことを検討する必要があります。その場合、日付の基になる数値が比較されるため、文字列表現は問題になりません。

iOS クライアントで比較を行う必要がある場合は、JSON をレンダリングするときに両方の日付値を明示的にフォーマットして、一貫した表現が得られるようにする必要があります。created.strftime(...)andを実行してTime.now.strftime(...)、値をフォーマットします。API の日付形式には ISO 8601 が適していますが、使用している iOS ライブラリを考慮して、何が最も使いやすいかを確認することをお勧めします。

于 2013-05-21T01:19:29.390 に答える