是的,这有点棘手。
我想创建一个每日触发器(DailyTimeIntervalTriggerImpl),以便它每天从07:30到23:45运行。问题是,它必须在用户指定的时区运行,在这种情况下,比如说东京时间。
据我了解,我需要将时间转换为UTC。
下面的示例工作正常,但触发器将在 endTimeUTC 之后过期。如何确保触发器连续运行?
注意:我尝试使用 DailyTimeIntervalTriggerImpl 的StartTimeOfDay和EndTimeOfDay属性,但是当我将它们转换为 UTC 时,我得到了奇怪的触发时间。我相信的问题是因为:
a) UTC 格式的开始时间(在本例中)为2012 年12 月 31 日晚上 10:30:00和
b) UTC 的结束时间是2013 年 1 月 1 日下午 2:30:00(次日)。
DailyTimeIntervalTriggerImpl StartTimeOfDay和EndTimeOfDay仅采用 TimeOfDay 对象,该对象仅考虑时间而不考虑日期。
所以它将是 StartTimeOfDay = 10:30PM 和 EndTimeOfDay = 2:30PM,这没有任何意义。因为 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));
}