0

バックグラウンド:

プロジェクト内のユーザーにメールを送信するタスクをスケジュールしようとしています。毎日午前 2 時 EST にメールを送信して、このタスクを自動化したいと考えています。

私のコード:

私は本当に良いコードを本当に考えることはできませんが、私はこれをやっています:

 DateTime.Now.AddHours(hours);

しかし、問題は、このコードをサーバーに展開するDateTime.Nowと、展開時間がかかり、hoursその時間が長くなることです。

どうすればきれいな解決策を得ることができますか?

4

3 に答える 3

3

現地時間で作業するには、タイム ゾーンが必要です。

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) にアクションを実行できます。

于 2013-10-14T11:24:02.117 に答える
0

DateTime.UtcNow を使用し、それに時間を追加します。

すべてを UTC 時間で行い、コードの入口と出口で現地時間に変換することをお勧めします。

于 2013-10-14T11:17:49.857 に答える
0

私はQuartz.Netスケジューラでやった

構成には、式にCronMakerを使用します

サンプルコード

// construct a scheduler factory
ISchedulerFactory schedFact = new StdSchedulerFactory();

// get a scheduler
IScheduler sched = schedFact.GetScheduler();
sched.Start();

// construct job info
JobDetail jobDetail = new JobDetail("myJob", null, typeof(HelloJob));
// fire every hour
Trigger trigger = TriggerUtils.MakeHourlyTrigger();
// start on the next even hour
trigger.StartTimeUtc = TriggerUtils.GetEvenHourDate(DateTime.UtcNow);  
trigger.Name = "myTrigger";
sched.ScheduleJob(jobDetail, trigger); 

asp.net Web サイトで Quartz.net のセットアップを確認する

于 2013-10-14T11:27:15.483 に答える