0

そうです、これは少しトリッキーなものです。

毎日07:30から23:45まで実行されるように、毎日のトリガー(DailyTimeIntervalTriggerImpl)を作成したいと思います。問題は、ユーザーが指定したタイムゾーン(この場合は東京時間など)で実行する必要があることです。

私の理解から、私は時間をUTCに変換する必要があります。

以下の例は正常に機能しますが、トリガーはendTimeUTCの後に期限切れになります。トリガーが継続的に実行されるようにするにはどうすればよいですか?

:DailyTimeIntervalTriggerImplのStartTimeOfDayプロパティとEndTimeOfDayプロパティを使用しようとしましたが、UTCに変換すると奇妙な起動時間が発生します。私が信じている問題は次の理由によるものです:

a)UTC形式(この例では)の開始時刻は、2012年12月31日午後10時3分00秒になります。

b)UTCでの終了時刻は2013年1月1日午後2時30分翌日)です。

DailyTimeIntervalTriggerImpl StartTimeOfDayおよびEndTimeOfDayは、日ではなく時刻のみを考慮したTimeOfDayオブジェクトのみを取ります。

したがって、StartTimeOfDay =10:30PMおよびEndTimeOfDay=2:30 PMになりますが、これは実際には意味がありません。EndTimeOfDayは、実際には翌日の午後2時30分になるはずだからです。

何か案は?

 var startTime = DateTime.Parse("2013/01/01 07:30:00");
 var endTime = DateTime.Parse("2013/01/01 23:45:00");

 var tokyoTimeZoneId = "Tokyo Standard Time";

 TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(tokyoTimeZoneId);

 var startDateTimeUtc = TimeZoneInfo.ConvertTimeToUtc(startTime, timeZoneInfo);
 var endDateTimeUtc = TimeZoneInfo.ConvertTimeToUtc(endTime, timeZoneInfo);

 var dailyTrigger = new DailyTimeIntervalTriggerImpl
  {
    RepeatIntervalUnit = IntervalUnit.Hour,
    DaysOfWeek = GetDays(), // method to get a Quartz.Collection.HashSet list
    RepeatInterval = 3, // every 3 hours
    Key = new TriggerKey(Guid.NewGuid().ToString(), "my-group"),
    StartTimeUtc = startDateTimeUtc,
    EndTimeUtc = endDateTimeUtc,
  };

  // Compute fire times just to show simulated fire times
  IList<DateTimeOffset> fireTimes = ComputeFireTimes(dailyTrigger, null, 10);

  foreach (var dateTimeOffset in fireTimes)
  {
    Console.WriteLine("utc:{0} tokyo:{1}", dateTimeOffset,
      TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.DateTime, timeZoneInfo));
  }
4

1 に答える 1

0

これを試して:

var daysOfWeek = new Quartz.Collection.HashSet<System.DayOfWeek>() { System.DayOfWeek.Wednesday, System.DayOfWeek.Thursday, System.DayOfWeek.Friday };

DateTimeOffset startTime = DateBuilder.DateOf(0, 0, 0, 14, 1, 2013);
DateTimeOffset endTime = DateBuilder.DateOf(0, 0, 0, 20, 1, 2013);

TimeOfDay startTimeOfDay = TimeOfDay.HourMinuteAndSecondOfDay(7, 30, 0);
TimeOfDay endTimeOfDay = TimeOfDay.HourMinuteAndSecondOfDay(23, 45, 0);

var tokyoTimeZoneId = "Tokyo Standard Time";
TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(tokyoTimeZoneId);

var dailyTrigger = new DailyTimeIntervalTriggerImpl
{
StartTimeUtc = startTime.ToUniversalTime(),
EndTimeUtc = endTime.ToUniversalTime(),
StartTimeOfDay = startTimeOfDay,
EndTimeOfDay = endTimeOfDay,
RepeatIntervalUnit = IntervalUnit.Hour,
DaysOfWeek = daysOfWeek,
RepeatInterval = 3,             // every 3 hours
TimeZone = timeZoneInfo,
Key = new TriggerKey(Guid.NewGuid().ToString(), "my-group"),
};

// Compute fire times just to show simulated fire times
IList<DateTimeOffset> fireTimes = TriggerUtils.ComputeFireTimes(dailyTrigger, null, 1000);

foreach (var dateTimeOffset in fireTimes)
{
Console.WriteLine("utc:{0} - tokyo:{1}", dateTimeOffset,
  TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.DateTime, timeZoneInfo));
}

最新バージョンの2.1.1を使用することをお勧めします

于 2013-01-09T11:39:27.600 に答える