/// <summary> /// 获取 Cron 表达式下一个发生时间 /// </summary> /// <param name="expression"></param> /// <param name="cronFormat"></param> /// <returns></returns> public static DateTime?GetCronNextOccurrence(string expression, CronFormat cronFormat = CronFormat.Standard) { // 解析 Cron 表达式 var cronExpression = CronExpression.Parse(expression, cronFormat); // 获取下一个执行时间 var nextTime = cronExpression.GetNextOccurrence(DateTimeOffset.Now, TimeZoneInfo.Local); return(nextTime?.DateTime); }
/// <summary> /// 开始执行 Cron 表达式任务 /// </summary> /// <param name="expression">Cron 表达式</param> /// <param name="doWhat"></param> /// <param name="workerName"></param> /// <param name="description"></param> public static void Do(string expression, Action <SpareTimer, long> doWhat = default, string workerName = default, string description = default) { Do(() => { // 解析 Cron 表达式 var cronExpression = CronExpression.Parse(expression, CronFormat.IncludeSeconds); // 获取下一个执行时间 var nextTime = cronExpression.GetNextOccurrence(DateTimeOffset.Now, TimeZoneInfo.Local); return(nextTime?.DateTime); }, doWhat, workerName, description); }
/// <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 == default) { var parts = realExpression.Split(' ', StringSplitOptions.RemoveEmptyEntries); cronFormat = parts.Length <= 5 ? CronFormat.Standard : CronFormat.IncludeSeconds; } // 解析 Cron 表达式 var cronExpression = CronExpression.Parse(realExpression, cronFormat.Value); // 获取下一个执行时间 var nextTime = cronExpression.GetNextOccurrence(DateTimeOffset.UtcNow, TimeZoneInfo.Local); return(nextTime); }