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

相关推荐
wanhengidc2 分钟前
云手机的应用场景较为广泛,主要包括以下几个方面:
运维·服务器·安全·智能手机
丶小鱼丶6 分钟前
Spring之【初识AOP】
java·spring
captainOO78 分钟前
CSS Pixels vs Physical Pixels
前端·css
亲爱的非洲野猪10 分钟前
如何定位一个高并发场景下API响应时间从200ms突增到2s的问题
java·性能优化·线上问题
VisuperviReborn15 分钟前
打造自己的前端监控---前端性能监控
前端·javascript·架构
编程小生19 分钟前
区块链基础-BTC
前端
x吴文龙23 分钟前
不再踩坑,在Vue3+vite安装UNOCSS
前端·vue.js
Java&Develop27 分钟前
用html写一个类似于postman可以发送请求
前端·html·postman
都叫我大帅哥28 分钟前
⏱️ 时间轮算法实现延迟消息:高性能的"消息闹钟"
java
拾光拾趣录33 分钟前
让 Vue 动起来!用 Motion for Vue 打造丝滑交互的实战指南
前端·vue.js