quartz 表达式最近10次执行时间接口编写

Nuget安装

<PackageReference Include="CronExpressionDescriptor" Version="2.41.0" />
<PackageReference Include="CronExpressionDescriptor-zh-CN" Version="2.32.0" />
<PackageReference Include="Quartz" Version="3.14.0" />

Post 接口:Mock

using System.Diagnostics;
using CronExpressionDescriptor;
using Microsoft.AspNetCore.Mvc;
using Quartz;
using SaaS.OfficialWebSite.Web.Models;

namespace SaaS.OfficialWebSite.Web.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult CronDescr()
        {
            return View();
        }

        [HttpPost]
        public IActionResult Mock(MockCronRequest cronRequest)
        {
            var mockCronResponse = new MockCronResponse { Data = new MockCronModel { } };

            try
            {
                var cronDescription = CronExpressionDescriptor.ExpressionDescriptor.GetDescription(cronRequest.Cron, new Options()
                {
                    DayOfWeekStartIndexZero = true,
                    Use24HourTimeFormat = true,
                    Locale = "zh-CN"
                });

                mockCronResponse.Data.CronDescription = cronDescription;

                var count = 10;
                // 计算并输出执行时间点
                var fireTimes = GetNextFireTimes(cronRequest.Cron, count);
                Console.WriteLine($"表达式: {cronRequest.Cron}");
                Console.WriteLine($"接下来 {count} 次执行时间点:");
                Console.WriteLine("-------------------------------");

                mockCronResponse.Data.NextTriggers = new List<string>();
                for (int i = 0; i < fireTimes.Count; i++)
                {
                    var next = $"{fireTimes[i]:yyyy-MM-dd HH:mm:ss.fff}";
                    Console.WriteLine(next);
                    mockCronResponse.Data.NextTriggers.Add(next);
                }
                mockCronResponse.Success = true;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message, ex);
                mockCronResponse.Success = false;
                mockCronResponse.Message = ex.Message;
            }
            return Ok(mockCronResponse);
        }

        public static List<DateTimeOffset> GetNextFireTimes(string cronExpression, int count, DateTimeOffset? startTime = null)
        {
            var results = new List<DateTimeOffset>();

            // 获取北京时间时区
            TimeZoneInfo chinaTimeZone = TimeZoneInfo.FindSystemTimeZoneById(
                OperatingSystem.IsWindows() ?
                "China Standard Time" :
                "Asia/Shanghai");

            // 设置起始时间为当前北京时间
            startTime ??= TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, chinaTimeZone);

            // 创建Cron表达式解析器(指定北京时间时区)
            var cronTrigger = (ICronTrigger)TriggerBuilder.Create()
                .WithCronSchedule(cronExpression, x => x.InTimeZone(chinaTimeZone))
                .Build();

            // 获取后续触发时间点
            DateTimeOffset? current = startTime;
            for (int i = 0; i < count; i++)
            {
                current = cronTrigger.GetFireTimeAfter(current);
                if (!current.HasValue) break;

                // 确保时间点是北京时间
                results.Add(TimeZoneInfo.ConvertTime(current.Value, chinaTimeZone));
            }
            return results;
        }
    }
}

运行效果:Cron表达式生成器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值