public void TestQtz259() { ITrigger trigger = TriggerBuilder.Create().WithIdentity("test").WithCronSchedule("0 0 0 L-2 * ? *").Build(); int i = 0; DateTimeOffset?pdate = trigger.GetFireTimeAfter(DateTimeOffset.Now); while (++i < 26) { DateTimeOffset?date = trigger.GetFireTimeAfter(pdate); // Console.WriteLine("fireTime: " + date + ", previousFireTime: " + pdate); Assert.False(pdate.Equals(date), "Next fire time is the same as previous fire time!"); pdate = date; } }
public void ShouldHandleDstFallBackTransition() { TimeZoneInfo tz = TZConvert.GetTimeZoneInfo("Pacific Standard Time"); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(1, 30).InTimeZone(tz)) .ForJob("job1", "group1") .Build(); DateTimeOffset midnight = new DateTimeOffset(2016, 11, 6, 0, 0, 0, TimeSpan.FromHours(-7)); DateTimeOffset?fireTime = trigger.GetFireTimeAfter(midnight); // It should fire at the first instance, which is 1:30-7 - the DAYLIGHT time, not the standard time. DateTimeOffset expectedTime = new DateTimeOffset(2016, 11, 6, 1, 30, 0, TimeSpan.FromHours(-7)); // We should definitely have a value Assert.NotNull(fireTime); // fireTime always is in UTC, but DateTimeOffset comparison normalized to UTC anyway. // Conversion here is for clarity of interpreting errors if the test fails. DateTimeOffset convertedFireTime = TimeZoneInfo.ConvertTime(fireTime.Value, tz); Assert.AreEqual(expectedTime, convertedFireTime); }
//GetCronSchdule("0 */1 * * * ?", 10,DateTimeOffset.Now); /// <summary> /// Corn表达式的运行时间 /// </summary> /// <param name="cron">表达式</param> /// <param name="times">计算次数</param> /// <param name="startTime">开始时间</param> /// <returns></returns> public static IList <DateTimeOffset?> GetCronSchdule(String cron, int times, DateTimeOffset startTime) { var list = new List <DateTimeOffset?>(); if (!CronExpression.IsValidExpression(cron)) { return(list); } try { ITrigger trigger1 = TriggerBuilder.Create() .WithCronSchedule(cron) .StartAt(DateTime.Now) .Build(); DateTimeOffset?lastTime = startTime; //Console.WriteLine(LastTime.ToString()); //list.Add(lastTime); for (int i = 0; i < times; i++) { DateTimeOffset?s = trigger1.GetFireTimeAfter(lastTime); lastTime = s; //Console.WriteLine(((DateTimeOffset)s).AddHours(8).ToString()); list.Add(s.Value.AddHours(8)); } } catch { } return(list); }
public void ShouldHandleDstSpringForwardTransition() { TimeZoneInfo tz = TZConvert.GetTimeZoneInfo("Pacific Standard Time"); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(2, 30).InTimeZone(tz)) .ForJob("job1", "group1") .Build(); DateTimeOffset midnight = new DateTimeOffset(2016, 3, 13, 0, 0, 0, TimeSpan.FromHours(-8)); DateTimeOffset?fireTime = trigger.GetFireTimeAfter(midnight); // It should fire at the equivalent valid local time. 2:30-8 does not exist, so it should run at 3:30-7. DateTimeOffset expectedTime = new DateTimeOffset(2016, 3, 13, 3, 30, 0, TimeSpan.FromHours(-7)); // We should definitely have a value Assert.NotNull(fireTime); // fireTime always is in UTC, but DateTimeOffset comparison normalized to UTC anyway. // Conversion here is for clarity of interpreting errors if the test fails. DateTimeOffset convertedFireTime = TimeZoneInfo.ConvertTime(fireTime.Value, tz); Assert.AreEqual(expectedTime, convertedFireTime); }
public void ShouldHandleDstFallBackTransition_AndNotRunTwiceOnTheSameDay() { TimeZoneInfo tz = TZConvert.GetTimeZoneInfo("Pacific Standard Time"); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(1, 30).InTimeZone(tz)) .ForJob("job1", "group1") .Build(); DateTimeOffset firstRun = new DateTimeOffset(2016, 11, 6, 1, 30, 0, TimeSpan.FromHours(-7)); DateTimeOffset?fireTime = trigger.GetFireTimeAfter(firstRun); // It should not fire again at 1:30-8 on the same day, but should instead fire at 1:30-8 the following day. DateTimeOffset expectedTime = new DateTimeOffset(2016, 11, 7, 1, 30, 0, TimeSpan.FromHours(-8)); // We should definitely have a value Assert.NotNull(fireTime); // fireTime always is in UTC, but DateTimeOffset comparison normalized to UTC anyway. // Conversion here is for clarity of interpreting errors if the test fails. DateTimeOffset convertedFireTime = TimeZoneInfo.ConvertTime(fireTime.Value, tz); Assert.AreEqual(expectedTime, convertedFireTime); }
public Task TriggerMisfired(ITrigger trigger, CancellationToken cancellationToken = default(CancellationToken)) { return(new TaskFactory().StartNew(() => { ConsoleExtend.WriteLineDebug2(@"监听器名称【{0}】 触发器【{1}=>{2}】触发丢失 触发器描述【{3}】 作业【{4}=》{5}】 触发器参数【{6}】 触发器日历名称【{7}】 最后执行时间【{8}】 下次执行时间【{9}】" , Name , trigger.Key.Group , trigger.Key.Name , trigger.Description , trigger.JobKey.Group , trigger.JobKey.Name , Newtonsoft.Json.JsonConvert.SerializeObject(trigger.JobDataMap) , trigger.CalendarName , trigger.FinalFireTimeUtc.HasValue ? trigger.FinalFireTimeUtc.Value.LocalDateTime.ToString() : String.Empty //最终执行时间 , trigger.GetFireTimeAfter(DateTimeOffset.Now).HasValue ? trigger.GetFireTimeAfter(DateTimeOffset.Now).Value.LocalDateTime.ToString("yyyy-MM-dd HH:mm:ss") : String.Empty //下次执行时间 ); })); }
public Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken = default(CancellationToken)) { return(new TaskFactory().StartNew(() => { ConsoleExtend.WriteLineDebug(@"监听器名称【{0}】 触发器【{1}=>{2}】触发完成 触发器描述【{3}】 作业【{4}=》{5}】 触发器参数【{6}】 触发器日历名称【{7}】 最后执行时间【{8}】 下次执行时间【{9}】 作业执行时间【{10}】 触发的实际时间【{11}】 context中下次执行时间【{12}】" , Name , trigger.Key.Group , trigger.Key.Name , trigger.Description , trigger.JobKey.Group , trigger.JobKey.Name , Newtonsoft.Json.JsonConvert.SerializeObject(trigger.JobDataMap) , trigger.CalendarName , trigger.FinalFireTimeUtc.HasValue ? trigger.FinalFireTimeUtc.Value.LocalDateTime.ToString() : String.Empty //最终执行时间 , trigger.GetFireTimeAfter(DateTimeOffset.Now).HasValue ? trigger.GetFireTimeAfter(DateTimeOffset.Now).Value.LocalDateTime.ToString("yyyy-MM-dd HH:mm:ss") : String.Empty //下次执行时间 , new DateTime(context.JobRunTime.Ticks) //作业执行时间 , context.FireTimeUtc.LocalDateTime , context.NextFireTimeUtc.HasValue ? context.NextFireTimeUtc.Value.LocalDateTime.ToString() : String.Empty ); })); }
private IEnumerable<DateTimeOffset> GetAllTimes(ITrigger trigger, DateTimeOffset startTime, DateTimeOffset end) { var start = startTime; DateTimeOffset? time = start; while (true) { time = trigger.GetFireTimeAfter(time); if (!time.HasValue || time > end) break; yield return time.Value; } }