当社はSaaSアプリケーションを実行しており、ユーザーは世界中からログインします(ほとんどが米国にあります)。すべての時間関連情報をUTCとして保存しますが、現地時間を使用して時間を表示する必要がありますアプリケーションはWebベースであり、JavaScriptを使用して1年のさまざまな時間帯のUTCオフセットを決定することにより、ユーザーのタイムゾーンを「自動検出」します。ユーザーのオフセット情報は、最初のリクエストでサーバーに渡されますサーバーは、認識しているすべてのタイムゾーンを検索し、一致する有効なタイムゾーンを確認します。
組み込みのTimeZoneInfoオブジェクトを使用したいのですが、
TimeZoneInfo.GetSystemTimeZones();
サーバーのレジストリ設定に依存します。現在、WCFサービスレイヤーをホストする18台の負荷分散されたWebサーバーがあり、私はbelieve TechOpsチームは、すべてのサーバーが常に同じサービスパックでパッチされていることを確認しています。
また、米国のさまざまなタイムゾーン、特に太平洋、山岳、中部、東部にも特に注意を払う必要があります。文字列ベースのIdフィールドはnotがすぐに変わると想定できますか?たとえば、私が電話した場合
TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")
適切なTimeZoneInfoオブジェクトが返されるようにしたい。
だからいくつかの質問:
組み込みのTimeZoneInfoクラスを使用して、順調に進んでいると思います。 IDは決して変更されるべきではありませんが、名前は変更されます(XPとVistaの間でいくつかが変更されたとき、私は難しいことを学びました)。私は実質的に同じアプローチ(サービスとデータベースレイヤーでのみUTC、Webサーバーとクライアントのローカル時間)を使用しましたが、うまく機能しました。
私が提案することの1つは、使用する予定のさまざまなTimeZoneInfoメソッドをインターフェイスITimeZoneConverter
またはそのような性質のものでラップすることです。これにより、後で実装を変更する必要がある場合は、より簡単になります。
ランダムな不快感:.Net TimeZoneInfoクラスは、タイムゾーンが与えられた場合に省略形を与えることができません。 IE:「東部標準時」の「EST」はないので、それが必要な場合は、そのためのなんらかのリソースファイルまたはテーブルへのルックアップを計画してください。
Javascriptは、実際にはタイムゾーンを通知することはできません。UTCからのタイムゾーンオフセットのみです。それは微妙な違いであり、あなたの場合それは重要ではないように聞こえますが、どのタイムゾーンがユーザーに割り当てられているかを見るとき、それは心に留めておくべきものです。
私はいくつかの このようなJSライブラリ を見てきました。これは、オフセットと最も多く設定されているタイムゾーンに基づいてクライアント側のタイムゾーンを推測しようとします。それは興味深いアプローチですが、それが本番環境でどれだけうまく機能するかはわかりません。
最後に、過去に私を悩ませたのは、JSONは実際には日時のフォーマット方法について何も指定していないということです。 ( 関連する読み方 )多くのajax/asyncリクエストを実行していて、utcとローカル時間の間で相互に変換するつもりである場合、これは苦痛になる可能性があります。一般的な構文解析/オフセット機能を作成し、チームの全員がそれらを認識していることを確認し、これらの問題を処理するたびにホイールを再発明しないようにしてください。
考慮すべきもう1つのこと:xSTとxDTには違いがあります。たとえば、アリゾナはMSTです。つまり、DSTに準拠していないため、冬は山に、夏は太平洋にいます。