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

cs 复制代码
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表达式生成器

相关推荐
&白帝&1 小时前
前端实现截图的几种方法
前端
动能小子ohhh1 小时前
html实现登录与注册功能案例(不写死且只使用js)
开发语言·前端·javascript·python·html
Xiaouuuuua1 小时前
我开源了一套springboot3快速开发模板
java·开发语言·开源
小小小小宇1 小时前
大文件断点续传笔记
前端
Jimmy2 小时前
理解 React Context API: 实用指南
前端·javascript·react.js
保持学习ing2 小时前
SpringBoot电脑商城项目--显示勾选+确认订单页收货地址
java·前端·spring boot·后端·交互·jquery
三好码农2 小时前
深入Android 15 Zygote:从进程孵化器到系统基石
java·架构
穆易青2 小时前
2025.06.20【pacbio】|使用Snakemake构建可重复的PacBio全基因组甲基化分析流程
java·运维·服务器
李明一.2 小时前
Java 全栈开发学习:从后端基石到前端灵动的成长之路
java·前端·学习