複数のタイムゾーンのクライアントにサービスを提供するアプリケーションで日付と時刻を処理しますか?
-
18-09-2019 - |
質問
文字列処理に関連する国際化の問題は、次のアドバイスに従うことでほとんど解決できます。Unicode を使用し、すべてを UTF-8 としてデータベースに保存すると、世界中のすべての言語を使用してクライアントにサービスを提供できるようになります。
しかし、日付/時刻の処理に関連する国際化の問題はどうなるのでしょうか?
質問:
- 時刻処理に関する国際化の問題を解決するための、同様のわかりやすいベスト プラクティスはありますか?
- アプリケーションが異なるタイムゾーンで動作するクライアントにサービスを提供できることを確認するにはどうすればよいでしょうか?どのような問題が発生し、どのように解決しましたか?
解決
以下のようなアドバイスがありますが、
- すべての時間を 1 つのタイムゾーン (できれば Zulu (GMT)) でデータベースに保存します。
- 登録時に各ユーザーにタイムゾーンを割り当てます。通常、これは登録ページの言語またはプロモーション リンクに埋め込まれたコードから判断されます。場合によっては、ユーザーに質問しなければならないこともあります。
- クライアントにタイムゾーンを認識させます。これは、クライアントがサーバーからの時間をそのまま表示できないことを意味します。ローカル タイムゾーンおよびローカル形式で表示する必要があります。
- クライアントは、システムのタイムゾーン情報を取得するために何らかの努力をする必要があります。そうでない場合、サーバーはさまざまなデータから推測できます。最初に言語を使用し、次に IP アドレスを使用すると、良い結果が得られました。いずれの場合でも、クライアントはゾーン情報を含む時間を表示して、時間が間違っているときに何が起こっているかをユーザーに知らせる必要があります。
- タイムゾーンの影響を受けない特定の時間値には特別なフラグが必要です。ユーザーがロケールを変更すると誕生日が変わるという間違いがありました。このカテゴリに属するその他の事項には、休日、店舗の営業時間などが含まれます。
- サーバーとクロックを同期する必要がある場合は、システム時間を変更せず、クライアントにデルタを保存するだけにしてください。クロックがホストと同期している必要があるというセキュリティ要件がありました。したがって、クライアントは起動時にシステムクロックをサーバーと同期します。それは間違ったことです。タイムゾーンのない Windows 95 などの古いシステムの場合は、時間を GMT に変更しました。ついに古いクライアントはなくなりましたが、NTP からの正確な時刻を間違えてしまうという新たな問題に直面しています。
私たちの間違いのいくつかが、それらを避けるのに役立つことを願っています。
他のヒント
ZZCoder にはいくつかの優れた点があります。さらにいくつかあります:
- すべての日時値にはタイムゾーンが関連付けられている必要があります。datetime に日付がない場合の意味を定義する必要があります (たとえば、場合によっては GMT+0 を意味します。他の場合は、コードがそれを見つけて割り当てている最中であるためです)。
- おそらく、日時を含むイベントを場所に添付する必要があるでしょう。これは、日時のタイムゾーンの変更がいつ許可されるかを把握する方法があることを意味します。これにより、誕生日が移動するという問題が解決されるだけでなく、夏時間の開始時または終了時にインテリジェントな動作が可能になります。ただし、意図しない関係には注意してください。異なるタイムゾーンにいる複数の人々の会議を設定する場合は、日時をコピーしてローカライズするのではなく、1 つの正規エントリを参照する必要があります。
- しないでください 自分で計算してください:いつも いつも いつも ライブラリ関数に日時の計算を依頼します。
私は、クライアントが自分の時間帯をお知らせ持っているいくつかのJavaScriptを使用して、このといくつかの運を持っていたと思います。私が覚えていれば、それは現地時間で、ユーザーのマシン上で現在の時刻を計算して、ズールーに対してその比較関わっています。
所属していません StackOverflow