4

これはテクノロジー自体に関する投稿ではなく、適切なアルゴリズムに関する投稿です。ユーザーが毎週特定の時間にアプリケーションでイベントをスケジュールできるようにしたいと考えています (サイトのタイム ゾーンで表示されます)。

ニューヨークのユーザーが、EST の午後 8 時にイベントが発生するようにスケジュールしたとします。このユーザーのために、夏時間に関係なく、年間を通して毎週東部標準時の午後 8 時にイベントを発生させたいと考えています。

現在、データベースに UTC の時間値を保存していますが、UTC は時期によって変わりません。一部のタイムゾーンには夏時間の概念があり、一部のタイムゾーンには含まれていないようです。つまり、タイムゾーン変換処理をオンザフライで行う場合 (イベントをスケジュールするために日付を検索するクエリの前、または表示するために)ユーザーのタイムゾーンが夏時間をサポートしているかどうか、およびターゲットのタイムスタンプが夏時間内にあるかどうかを確認する必要があります。

人々は通常、この種の問題をどのように解決しますか? 言い換えれば、論理時間をデータベースに保存し、適切に表示し、夏時間に関係なく、すべてのユーザーのタイムゾーンで適切にタスクをスケジュールするために使用する方法を、可能な限り最も簡単な方法で行うにはどうすればよいでしょうか?

4

3 に答える 3

1

私は 1 つの仮定をします。あなたは「...東部時間で毎週、1 年中」という意味でした。EST と言うときは、特に東部標準時を指しています。DST が適用される場合、東部夏時間(EDT) と呼ばれます。

また、省略形はタイム ゾーンを識別するのに適した方法ではありません。オーストラリアの EST (UTC+10) ではなく、米国の EST (UTC-5) のことだとどのように判断できますか? 略語があいまいです。ここでかなり包括的なリストを見ることができます。

最初に行うことは、ユーザーのタイム ゾーンを識別する方法を決定することです。一般的に使用される 2 つのデータベースがあります。

Microsoft タイム ゾーン データベース

PRO

  • Windows オペレーティング システムに組み込まれています。
  • 更新プログラムは、Windows Update を通じて自動的に展開されます。
  • Win32 または .Net Framework から簡単に使用できます。

短所

  • 標準化団体またはコミュニティではなく、Microsoft によって管理されています。
  • ゾーンは洗練されたものではなく、非常に広い傾向があります。
  • 過去のタイム ゾーンの変更には適していません。
  • Microsoft 以外のサーバーとの相互運用性は困難な場合があります。
  • 更新頻度が低め。

IANA/オルソン タイム ゾーン データベース

PRO

  • Linux、Mac、Java、PHP、およびその他の多くのプラットフォームで広く実装されています。
  • ライブラリは、JavaScriptおよびWindows/.Netで利用できます。
  • 模範的な都市から名付けられた、洗練された個別のタイム ゾーン。
  • タイム ゾーン変更の履歴データが含まれます。
  • 多くの RFC やその他の標準で参照されています。
  • コミュニティが維持し、最近 IANA によって支援されました。
  • 年に数回の頻繁な更新。

短所

  • 一部の実装ではそうするかもしれませんが、通常は自動的に維持されません。
  • 非常に多くのゾーンがあるため、単純なドロップダウン リストをユーザーに提示するのは難しい場合があります。このような地図ベースのタイムゾーン ピッカーは、ユーザー エクスペリエンスを向上させるために必要です。

ユーザーがいるタイムゾーンを特定したので、元の質問の核心に移りましょう。DST の変更に関係なく、同じ現地時間に繰り返されるイベントをどのように処理する必要がありますか?

実際には、永続性と実行という 2 つの異なる懸念事項があります。

永続化 (およびトランスポート、表示など) のためには、現地時間とタイム ゾーンを組み合わせて保存する必要があります。たとえば、America/New_YorkIANA ゾーンでは午後 8:00 です。フレームワークで可能であれば、この時間を日付コンポーネントなしで保存します。UTC に変換したり、DST に合わせて調整したりしないでください。ユーザーの意図を、ユーザーが表現したとおりに捉えているだけです。

実行するには、定期的なジョブを特定のスケジュールされた時間に起動する必要があります。ジョブが実行されているサーバーは、まったく異なるタイム ゾーンにある可能性があります。必要なのは一連の UTC DateTime 値です。そのため、タスク スケジューラを特定の瞬間に起動するように設定できます。DateTimeOffsetこれには、.Netなどの local-time-plus-utc-offset を使用することもできます。これには、オフセットが -4 と -5 の間で切り替わっていたとしても、すべての値で 8:00PM が表示されるという利点があります。DateTime と DateTimeOffsetを参照してください。

これら 2 つの概念を一致させるには、現地時間を評価して実行タイムスタンプを計算するコードが必要です。各ジョブの実行時に次のスケジュールされたジョブをセットアップするか、定期的にこれを実行して、将来の X 個のイベントのイベント時間を予測することができます。それはあなた次第です。将来のイベントの日付をカレンダーに記載する必要がある場合は、後者のアプローチが必要です。

于 2013-03-08T14:46:33.843 に答える
0

夏の終わりに国がDSTから切り替えると、時計が元に戻り、同じ時刻に1日2時間あるため、できるだけ早くUTCに変換し、できるだけ遅くUTCから変換します。したがって、DST時間はすべての時間を一意に記述することはできません。

于 2013-03-07T05:22:25.817 に答える
0

おそらく、公開されているタイム ゾーン API のいずれかを使用できます。例えば。https://developers.google.com/maps/documentation/timezone/ .

于 2013-03-07T04:32:08.730 に答える