シカゴでの先物市場の閉鎖後に毎日コードを実行する機能をプログラムに追加しようとしています。これは、東部時間の 5 時 35 分頃 (市場のある中央時間の 4 時 35 分) にコードを実行することを意味します。これはもちろん、サマータイムが発生すると、EST (UTC -5) と EST (UTC -4) の間で切り替えられます。
似たような質問がたくさんあることは知っていますが、どれも私が使用できる解決策を提供していないようです。主な提案は、タスク スケジューラまたはクォーツを使用することですが、プログラムにそれらを実装することはできません。最も有望な解決策はTimeZoneInfo
、 、DateTime
、およびの組み合わせを使用TimeSpan
して、適切な時間にトリガーされるタイマーを毎日スケジュールすることだと思います。私が現在持っている解決策はこれです:
DateTime now = DateTime.Now;
DateTime currentDateTime = now.DateTime.Date;
DateTime expiryDateTime = currentDateTime
.AddHours(17)
.AddMinutes(35)
.AddDays(
now.DateTime.Hour >= 18 + utcOffset
|| (now.DateTime.Hour == 17 && now.DateTime.Minute >= 35) ? 1 : 0);
Timer timer = new Timer(
...,
null,
expiryDateTime - DateTime.Now,
...);
ただし、私のコードが東部時間以外のタイムゾーンで実行されている場合、これは崩壊すると思います。また、タイム ゾーンが EST から EDT に、またはその逆に切り替わる 23 時間または 25 時間の日に、これが適切に動作しないことも懸念しています。
スケジューリングを処理するために現在行っている方法よりも良い方法はありますか? どのタイム ゾーンで実行されても、常に東部時間で同時に実行されるように、このコードをより堅牢にするにはどうすればよいでしょうか?
編集:前述のように、タスク スケジューラとクォーツはオプションではありません。サードパーティのライブラリを含めることができないため、Quartz は終了しました。プログラムから多くの内部値にアクセスする必要があるため、タスク スケジューラは使用できません。別のアプリケーションを起動し、それらの値をそのアプリケーションに公開すると、これがメリットだと思うよりもはるかに複雑になります。