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
上一篇 下一篇

猜你喜欢

热点阅读