/// <summary> /// 获取 Cron 表达式下一个发生时间 /// </summary> /// <param name="expression"></param> /// <param name="cronFormat"></param> /// <returns></returns> public static DateTimeOffset?GetCronNextOccurrence(string expression, CronFormat?cronFormat = default) { // 支持从配置模板读取 var realExpression = expression.Render(); // 自动化 CronFormat if (cronFormat == null) { var parts = realExpression.Split(' ', StringSplitOptions.RemoveEmptyEntries); cronFormat = parts.Length <= 5 ? CronFormat.Standard : CronFormat.IncludeSeconds; } // 解析 Cron 表达式 if (!CronExpressionSet.TryGetValue(realExpression, out var cronExpression)) { cronExpression = CronExpression.Parse(realExpression, cronFormat.Value); CronExpressionSet.TryAdd(realExpression, cronExpression); } // 获取下一个执行时间 var nextTime = cronExpression.GetNextOccurrence(DateTimeOffset.UtcNow, TimeZoneInfo.Local); return(nextTime); }