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