fix: handle timezone localization for reminder scheduling

This commit is contained in:
leo 2026-03-05 13:36:23 +08:00
parent 80988c6580
commit eebfbf2243
2 changed files with 8 additions and 2 deletions

View File

@ -3,6 +3,8 @@ from __future__ import annotations
from datetime import datetime from datetime import datetime
from typing import List, Optional from typing import List, Optional
import pytz
from sqlalchemy import ( from sqlalchemy import (
Boolean, Boolean,
DateTime, DateTime,
@ -74,7 +76,11 @@ class Reminder(Base):
def schedule_summary(self) -> str: def schedule_summary(self) -> str:
if self.reminder_type == "once" and self.once_time: if self.reminder_type == "once" and self.once_time:
return self.once_time.strftime("%Y-%m-%d %H:%M") tz = pytz.timezone("Asia/Shanghai")
dt = self.once_time
if dt.tzinfo is None:
dt = pytz.utc.localize(dt)
return dt.astimezone(tz).strftime("%Y-%m-%d %H:%M")
if self.reminder_type == "daily" and self.daily_time: if self.reminder_type == "daily" and self.daily_time:
return f"每天 {self.daily_time}" return f"每天 {self.daily_time}"
if self.reminder_type == "weekly" and self.weekly_days and self.daily_time: if self.reminder_type == "weekly" and self.weekly_days and self.daily_time:

View File

@ -101,7 +101,7 @@ def _build_trigger(reminder: Reminder):
return None return None
run_time = reminder.once_time run_time = reminder.once_time
if run_time.tzinfo is None: if run_time.tzinfo is None:
run_time = SHANGHAI_TZ.localize(run_time) run_time = pytz.utc.localize(run_time)
if run_time <= datetime.now(timezone.utc).astimezone(SHANGHAI_TZ): if run_time <= datetime.now(timezone.utc).astimezone(SHANGHAI_TZ):
return None # already passed return None # already passed
return DateTrigger(run_date=run_time, timezone=SHANGHAI_TZ) return DateTrigger(run_date=run_time, timezone=SHANGHAI_TZ)