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