Skip to content

Commit 47f78be

Browse files
authored
fix: display cron last_run_at in local timezone (#7625)
1 parent a1a7de1 commit 47f78be

2 files changed

Lines changed: 10 additions & 4 deletions

File tree

astrbot/core/cron/manager.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,9 @@ def _schedule_job(self, job: CronJob) -> None:
196196

197197
def _get_next_run_time(self, job_id: str):
198198
aps_job = self.scheduler.get_job(job_id)
199-
return aps_job.next_run_time if aps_job else None
199+
if not aps_job or aps_job.next_run_time is None:
200+
return None
201+
return aps_job.next_run_time.astimezone(timezone.utc)
200202

201203
async def _run_job(self, job_id: str) -> None:
202204
job = await self.db.get_cron_job(job_id)

astrbot/dashboard/routes/cron.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import traceback
2-
from datetime import datetime
2+
from datetime import datetime, timezone
33

44
from quart import jsonify, request
55

@@ -26,8 +26,12 @@ def __init__(
2626
def _serialize_job(self, job) -> dict:
2727
data = job.model_dump() if hasattr(job, "model_dump") else job.__dict__
2828
for k in ["created_at", "updated_at", "last_run_at", "next_run_time"]:
29-
if isinstance(data.get(k), datetime):
30-
data[k] = data[k].isoformat()
29+
v = data.get(k)
30+
if isinstance(v, datetime):
31+
# Attach UTC
32+
if v.tzinfo is None:
33+
v = v.replace(tzinfo=timezone.utc)
34+
data[k] = v.isoformat()
3135
# expose note explicitly for UI (prefer payload.note then description)
3236
payload = data.get("payload") or {}
3337
data["note"] = payload.get("note") or data.get("description") or ""

0 commit comments

Comments
 (0)