0

現在、Quartz.Net Scheduler を使用してさまざまなジョブをスケジュールしています。UI で、ユーザーはジョブをトリガーする頻度 (毎週、曜日、時間) を構成できます。ユーザーがこれらのプロパティを構成できるようになると、現在次のトリガー時間が表示されます。

例: 毎週日曜日の午前 2 時 CronString: 0 0 2 ? * SUN * 現在の日付: 2013 年 3 月 8 日金曜日 タイムゾーン: EST UTC-5.30 次のトリガー時間: 2013 年 3 月 10 日日曜日 2:00 AM

これはうまく機能しています。ただし、DST が 2 月 10 日に開始する場合、その日の午前 2:00 はありません。したがって、CronExpression は次のエラーをスローします。

CronExpression exp = new CronExpression(cronStr);
var dt = exp.GetNextValidTimeAfter(DateTime.Now.ToUniversalTime()).Value.ToLocalTime();
return String.Format("{0:dddd, MMMM d, yyyy}", dt);

例外: ArgumentException がスローされました。メッセージ: 「指定された DateTime は無効な時刻を表しています。」

カレンダーにはそのような日時が存在しないため、その日をスキップして、次の有効な日付、つまり 2013 年 3 月 17 日日曜日 2:00 AM を表示します。

これは、Quartz コードの .Net CLR によって内部的にスローされるため、どうすれば修正できますか。

4

1 に答える 1

1

TimeZoneInfo.Local.IsInvalidTime を使用して、時間が有効かどうかを確認できます。これは、3 月の第 2 日曜日の午前 2:00 から午前 3:00 までの時間に true を返します (ほとんどの米国とカナダでは DST が開始されます)。 .

詳細については、 http://blogs.msdn.com/b/bclteam/archive/2007/06/11/system-timezoneinfo-working-with-ambiguous-and-invalid-points-in-time-josh-freeをご覧ください。 .aspx

于 2013-02-01T18:00:07.357 に答える