Пример #1
0
        /// <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);
        }