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