私は 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_York
IANA ゾーンでは午後 8:00 です。フレームワークで可能であれば、この時間を日付コンポーネントなしで保存します。UTC に変換したり、DST に合わせて調整したりしないでください。ユーザーの意図を、ユーザーが表現したとおりに捉えているだけです。
実行するには、定期的なジョブを特定のスケジュールされた時間に起動する必要があります。ジョブが実行されているサーバーは、まったく異なるタイム ゾーンにある可能性があります。必要なのは一連の UTC DateTime 値です。そのため、タスク スケジューラを特定の瞬間に起動するように設定できます。DateTimeOffset
これには、.Netなどの local-time-plus-utc-offset を使用することもできます。これには、オフセットが -4 と -5 の間で切り替わっていたとしても、すべての値で 8:00PM が表示されるという利点があります。DateTime と DateTimeOffsetを参照してください。
これら 2 つの概念を一致させるには、現地時間を評価して実行タイムスタンプを計算するコードが必要です。各ジョブの実行時に次のスケジュールされたジョブをセットアップするか、定期的にこれを実行して、将来の X 個のイベントのイベント時間を予測することができます。それはあなた次第です。将来のイベントの日付をカレンダーに記載する必要がある場合は、後者のアプローチが必要です。