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:
@@ -25,6 +25,11 @@ def compute_next_run(cron_expression: str, after: Optional[datetime] = None, tz:
|
||||
下次执行的 UTC datetime(naive,存储时与 datetime.utcnow() 对齐)
|
||||
"""
|
||||
base = after or datetime.now(timezone.utc)
|
||||
# 确保 base 是 timezone-aware UTC(datetime.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)
|
||||
|
||||
Reference in New Issue
Block a user