Cron获取前一次触发时间(二分查找)
2024-08-11 本文已影响0人
rekcah1986
using System;
using Cronos;
class Program
{
static void Main(string[] args)
{
// 定义一个Cron表达式
var cronExpression = "45 8 * * 2-5"; // 每周二到周五的8:45
var cron = CronExpression.Parse(cronExpression);
// 定义参考时间并转换为UTC时间
var referenceTime = DateTime.UtcNow;
// 查找上一次触发时间
var previousOccurrence = GetPreviousOccurrence(cron, referenceTime);
Console.WriteLine($"上一次触发时间: {previousOccurrence}");
}
static DateTime? GetPreviousOccurrence(CronExpression cron, DateTime referenceTime)
{
// 确保上下界都是UTC时间
DateTime lowerBound = referenceTime.AddMonths(-1).ToUniversalTime(); // 向前1个月,不够的话可以增加
DateTime upperBound = referenceTime.ToUniversalTime();
DateTime? result = null;
const int maxIterations = 100; // 防止无限循环的最大迭代次数
int iteration = 0;
// 二分查找
while (lowerBound <= upperBound && iteration < maxIterations)
{
iteration++;
var midpoint = lowerBound.AddMinutes((upperBound - lowerBound).TotalMinutes / 2);
var nextOccurrence = cron.GetNextOccurrence(midpoint, inclusive: true);
if (nextOccurrence == null || nextOccurrence >= referenceTime)
{
upperBound = midpoint.AddMinutes(-1);
}
else
{
result = nextOccurrence;
lowerBound = nextOccurrence.Value.AddMinutes(1);
}
}
if (iteration >= maxIterations)
{
Console.WriteLine("达到最大迭代次数,可能未找到结果。");
}
else
{
Console.WriteLine("迭代次数: " + iteration);
}
return result;
}
}
输出
迭代次数: 9
上一次触发时间: 2024/8/9 08:45:00