enabled) { return false; } $now ??= CarbonImmutable::now($rule->timezone ?: 'Asia/Shanghai'); try { $cron = new CronExpression($rule->cron_expression); } catch (\Throwable) { return false; } return $cron->isDue($now); } public function nextRunAt(CrawlRule $rule, ?CarbonImmutable $from = null): ?CarbonImmutable { $from ??= CarbonImmutable::now($rule->timezone ?: 'Asia/Shanghai'); try { $cron = new CronExpression($rule->cron_expression); $next = CarbonImmutable::instance($cron->getNextRunDate($from)); } catch (\Throwable) { return null; } return $next->setTimezone('UTC'); } }