在使用 aiogram + APScheduler 库时,用户可能会遇到时区转换问题,尤其是在用户为多个时区的用户服务时。以下是一种解决方案,其中涉及将用户时区输入转换为 Python 的时区对象。
from typing import Optional
from pytz import timezone, UnknownTimeZoneError
from datetime import datetime
from apscheduler.schedulers.asyncio import AsyncIOScheduler
async def create_scheduler():
scheduler = AsyncIOScheduler(timezone='UTC')
return scheduler
async def remind_user(user_id: int, tz_offset: int, scheduled_time: datetime):
try:
tz = timezone(str(tz_offset / 3600))
except UnknownTimeZoneError:
tz = timezone('UTC')
local_time = scheduled_time.astimezone(tz)
local_time_str = local_time.strftime('%Y-%m-%d %H:%M')
# 发送提醒消息给用户
await bot.send_message(chat_id=user_id, text=f"您有一个预约在 {local_time_str} (UTC{tz_offset/3600:+})")
# 在用户输入时区之前进行验证
async def remind_user_with_tz(user_id: int, tz_name: Optional[str], scheduled_time: datetime):
if tz_name:
try:
tz = timezone(tz_name)
tz_offset = tz.utcoffset(datetime.utcnow()).seconds
except UnknownTimeZoneError:
tz_offset = 0
else:
# 用户未提供时区名
tz_offset = 0
await remind_user(user_id, tz_offset, scheduled_time)
在这个示例中,我们首先将用户提供的时区名传递给 timezone() 函数以获取有效的时区对象。如果找不到时区,我们默认使用UTC。接下来,我们使用 astimezone() 函数将预约时间转换为本地时间。最后,我们格式化本地时间并使用telegram bot 将其发送给用户。
需要注意的是,将用户时区输入转换为 Python 的时区对象需要确保输入的格式是方法的要求,
上一篇:Aiogram send_message: OSError: [Errno 22] 无效参数
下一篇:aiogram.utils.exceptions.WrongFileIdentifier: 指定了错误的文件标识符/HTTP URL