fix: display cron last_run_at in local timezone#7625
Merged
Soulter merged 1 commit intoAstrBotDevs:masterfrom Apr 17, 2026
Merged
fix: display cron last_run_at in local timezone#7625Soulter merged 1 commit intoAstrBotDevs:masterfrom
Soulter merged 1 commit intoAstrBotDevs:masterfrom
Conversation
Contributor
There was a problem hiding this comment.
Hey - I've left some high level feedback:
- Consider extracting the "naive == UTC" normalization into a shared helper (e.g.,
ensure_utc(dt)in a datetime utils module) so the manager and route layers don’t each reimplement the same assumption separately. - Since the serializer now implicitly treats all naive datetimes as UTC, it might be safer to enforce this at the data model/DB boundary (e.g., normalizing to UTC before persistence) so that future code paths can’t accidentally write local-time naive values that will later be misinterpreted.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- Consider extracting the "naive == UTC" normalization into a shared helper (e.g., `ensure_utc(dt)` in a datetime utils module) so the manager and route layers don’t each reimplement the same assumption separately.
- Since the serializer now implicitly treats all naive datetimes as UTC, it might be safer to enforce this at the data model/DB boundary (e.g., normalizing to UTC before persistence) so that future code paths can’t accidentally write local-time naive values that will later be misinterpreted.Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
Contributor
There was a problem hiding this comment.
Code Review
This pull request standardizes timezone handling for cron job timing. Specifically, it updates the cron manager to return UTC-aware datetimes for the next run time and modifies the job serialization logic to ensure datetime fields are explicitly marked as UTC before being converted to ISO format. I have no feedback to provide.
Soulter
approved these changes
Apr 17, 2026
Soulter
approved these changes
Apr 17, 2026
Aster-amellus
pushed a commit
to Aster-amellus/AstrBot
that referenced
this pull request
Apr 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
On the scheduled tasks page of the WebUI,
last_run_atwas displayed in UTC whilenext_run_timewas correctly displayed in the browser's local timezone. The root cause is inconsistent datetime semantics crossing the SQLite boundary:last_run_atwas written viadatetime.now(timezone.utc)(UTC-aware), whilenext_run_timecame from APScheduler as an aware datetime in the job's configured timezone. SQLite strips tzinfo on round-trip, so the serializer emitted naive ISO strings without offsets. The frontend'snew Date(iso).toLocaleString()then interpreted both as local time — correct by coincidence fornext_run_time, but shifted forlast_run_at.Modifications / 改动点
astrbot/core/cron/manager.py:_get_next_run_timenow normalizes APScheduler's aware datetime to UTC before persisting, so all cron datetime columns share the convention "stored as UTC".astrbot/dashboard/routes/cron.py: the route serializer attachestzinfo=UTCto any naive datetime beforeisoformat(), so the API emits ISO strings with an explicit+00:00offset that the frontend converts to the user's local timezone.Screenshots or Test Results / 运行截图或测试结果
Before:


After:
Checklist / 检查清单
😊 If there are new features added in the PR, I have discussed it with the authors through issues/emails, etc.
/ 如果 PR 中有新加入的功能,已经通过 Issue / 邮件等方式和作者讨论过。
👀 My changes have been well-tested, and "Verification Steps" and "Screenshots" have been provided above.
/ 我的更改经过了良好的测试,并已在上方提供了“验证步骤”和“运行截图”。
🤓 I have ensured that no new dependencies are introduced, OR if new dependencies are introduced, they have been added to the appropriate locations in
requirements.txtandpyproject.toml./ 我确保没有引入新依赖库,或者引入了新依赖库的同时将其添加到
requirements.txt和pyproject.toml文件相应位置。😮 My changes do not introduce malicious code.
/ 我的更改没有引入恶意代码。
Summary by Sourcery
Ensure cron job timestamps are stored and serialized with consistent UTC timezone information so the WebUI can display them correctly in the user’s local time.
Bug Fixes:
Enhancements: