fix: compute_next_run naive datetime treated as local time instead of UTC

When datetime.utcnow() (naive) was passed as after=, astimezone() treated
it as system-local time (Beijing), causing next_run_at to be calculated
incorrectly. Now naive datetimes are explicitly localized to UTC first.

Also replaced deprecated datetime.utcnow() with aware UTC equivalent.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
renjianbo
2026-05-05 09:20:14 +08:00
parent 0606137d57
commit 3dd098482e

View File

@@ -25,6 +25,11 @@ def compute_next_run(cron_expression: str, after: Optional[datetime] = None, tz:
下次执行的 UTC datetimenaive存储时与 datetime.utcnow() 对齐)
"""
base = after or datetime.now(timezone.utc)
# 确保 base 是 timezone-aware UTCdatetime.utcnow() 返回 naive需要先 localize
if base.tzinfo is None:
base = pytz.UTC.localize(base)
else:
base = base.astimezone(pytz.UTC)
# 将 UTC 时间转换为目标时区cron 表达式在目标时区下解释
try:
target_tz = pytz.timezone(tz)
@@ -117,7 +122,7 @@ def check_and_run_due_schedules() -> int:
db: Optional[Session] = None
try:
db = SessionLocal()
now = datetime.utcnow()
now = datetime.now(timezone.utc).replace(tzinfo=None) # naive UTC与 DB 存储一致
due_schedules = (
db.query(AgentSchedule)