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表达式生成器

相关推荐
小绫网络安全3 小时前
Kali Linux渗透测试入门教程:从零搭建到实战攻防
linux·运维·服务器
天疆说3 小时前
01 硬件选型与 llama.cpp 部署:4× RTX 5880 Ada 跑 DeepSeek-V4-Flash
java·redis·llama
西安景驰电子3 小时前
《PTP精确时间协议系列》第一篇:从原理到应用,全面解读IEEE 1588
linux·运维·服务器·开发语言·网络·windows·php
luj_17683 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
ZJU_统一阿萨姆3 小时前
【DSH】如何将 DeepSeek Harness 嵌入生产环境?万字解构 DeepSeek Agent Harness 的运行机制与安全边界
前端·javascript·安全
用户921080262863 小时前
4. 前端地图大量点位实时更新优化:后端推增量,前端做 diff
前端
水无痕simon3 小时前
3 短信应用场景以及平台架构
java·服务器
mister_guo4 小时前
JVM 内存管理原理及生产配置实战:从“参数能启动”到“内存可控”
java·jvm
风流 少年4 小时前
Spring AI 2.0:Tool
java·python·spring
SoaringHeart4 小时前
Flutter最佳实践:Web项目中文字体首次加载乱码问题解决
前端·flutter