REST APIは、日時を適切なクライアントのタイムゾーンに変換できる必要がありますか?


10

APIの実装中に、日時とタイムゾーンの問題が発生しました。

データベースでは、すべての日付がUTCに正規化されています。現在、非APIアプリケーションでは、すべての日時は、表示される前にまずユーザーの設定に基づいて変換されます。

APIについても同じ質問が浮上しました。APIは、要求のセマンティクスに基づいて、タイムゾーンに適した日時を返すことができる必要がありますか?

例えばGET /posts?timezone=America/Sao_Paulo

それとも、APIにアクセスしているクライアントで実行する必要がありますか?

更新:数回発生したため:現在タイムゾーン付きのタイムスタンプが返されます(ただし、常にTZオフセットです+00:00)。形式は人気のある8601です。2015-10-29T23:00:49+00:00


タイムゾーンを含むタイムスタンプを返すと、クライアントはそれを必要な現地時間に簡単に変換できます。とにかく、この質問はRESTとはまったく関係がないようです。RESTの原則に違反しない、これを実装する方法は数多くあります。このパラメーターを公開すると、より多くの作業が必要になることに注意してください。真にRESTfulなアーキテクチャでは、これらのリンクを何らかの方法で発見可能にする必要があります。クライアント側とサーバー側の両方で実装するのは不必要に複雑なことだと私は思います。
toniedzwiedz 2015年

>クライアント側とサーバー側の両方で実装するのは不必要に複雑なことだと私は思います。入力ありがとうございます!
マーク

回答:


17

絶対的な時点を返す必要があります。そうすれば、誰でも必要に応じてそのタイムスタンプをローカライズできます。「絶対タイムスタンプ」とは、UNIXタイムスタンプ、または標準化されたISO形式のいずれかでタイムゾーンを含む人間が読めるタイムスタンプを意味します(例:「2007-04-05T14:30Z」)。これは、必要に応じて、クライアントによって簡単にローカルタイムゾーンに変換できます。

タイムゾーンパラメータを受け入れ、タイムスタンプをそのタイムゾーンにローカライズしたいが、それでも絶対タイムスタンプを使用する必要がある場合。応答のタイムゾーン(例: "2007-04-05T16:30-02:00")。この値が以前のローカライズされていない値と同一であることを考えると、なぜこのパラメーターを提供するという問題を経験するのかはかなり疑問です。タイムスタンプの正確な表示形式は、最終的にはクライアントのフロントエンドに依存するため、とにかく値を後処理する可能性があります。


4
「なぜあなたが問題を経験するのかはかなり疑わしい」-他に何もなければ、それはくさびの薄い終わりです。このAPIの次のクライアントはstrftime、最初のクライアントがタイムゾーンを指定すると便利だと思ったのと同じ理由で、形式(および月/日の名前のロケール)を指定するように要求する場合があります。タイムゾーンが唯一の譲歩であっても、APIの応答をより複雑にしました。「毎回同じ形式のタイムスタンプ」ではなく、「私がそれを表現するように要求された方法で表現されたタイムスタンプ」になりました
スティーブジェソップ2015年

3
まさに、複雑さ。複雑さは悪です。製品やビジネスに付加価値を与えることなく、誰もが一生懸命働くことができます。千枚の切り傷による死。
ブランドン

2
>絶対的な時点で返答する必要があります。私はすでにこれを実行しているという私の質問を明確にしました。あなたの洞察をありがとう!
マーク

4

日時値をユーザーのローカルタイムゾーンに変換するロジックがすでにある場合は、APIで両方の可能性を提供できます。

クライアントがのような要求を行うGET /postsと、デフォルトのタイムゾーン(UTC)で常に取得されます。
クライアントがのようなリクエストを行うGET /posts?timezone=America/Sao_Paulと、応答のすべての時間が指定されたタイムゾーンに調整されます。

タイムゾーンで何をしたいかはクライアントの実装次第です。


2

通常、APIからUTCを期待します。

ただし、「REST API」がJavaScriptフレームワークを使用するWebページのサーバー側の一部である場合。実際にはViewModelを返すので、ローカライズされた文字列、数値、時間を含める必要があると私は主張します。


2

それは悪い、悪い、悪い考えです。クライアントがサーバーからの応答を保存し、その後ユーザーが別のタイムゾーンに移動する状況を考えます。これで、この「機能」がせいぜい何の利点ももたらさない、または大きなトラブルを引き起こす状況になっています。

ところで。これをテストする予定のタイムゾーンとクライアントの数は?サーバーがAmerica / Sao_Paulに対して期待される応答を返した場合、America / Sao_Pauloに対して何が応答されますか?


それは私の側の間違いでした、私はそれをに修正しましたAmerica/Sao_Paulo。タイムゾーンを特定できない場合にどうなるかは、議論次第だと思います。それは明らかに間違っているか、TZデータベースが古くなっているためです(後者は実際の名前ではありそうにありません(ただし、オフセット値ではそうではありません)。ただし、どちらの場合でも、おそらく400 BAD_REQUEST応答を返します。
マーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.