現地時間で作業するには、タイム ゾーンが必要です。
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
現地時間で表現するスケジュール時間を取得するには、現在の現地時間を取得し、次にいつスケジュールするかを決定する必要があります。
var estNow = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, timeZoneInfo);
var estScheduleAt = estNow.Date + TimeSpan.FromHours(2);
estScheduleAt
東部標準時の今日の午前 2 時になります。このコードが EST の午前 12 時から午前 2 時の間に実行される場合は、この時点で次のアクションをスケジュールする必要があります。ただし、現在の時刻が東部標準時午前 2 時以降の場合は、明日の午前 2 時 (まだ東部標準時間) にスケジュールする必要があるため、時刻に 1 日を追加する必要があります。
if (estScheduleAt <= estNow)
estScheduleAt += TimeSpan.FromDays(1);
estScheduleAt <= estNow
このアルゴリズムは、述語が true であるがアクションがスケジュールされる前は過去であるため、EST の午前 2 時直前に実行すると失敗する可能性があります。この状況では、追加の処理を追加する必要がある場合があります。
アクションをスケジュールする前に、タイムゾーンの問題を回避するために UTC に戻す必要があります。
var scheduleAt = TimeZoneInfo.ConvertTimeToUtc(estScheduleAt, timeZoneInfo);
これで、スケジューラでタイムスタンプを使用してscheduleAt
、次の午前 2 時 (EST) にアクションを実行できます。