ZoneInfoNotFoundError: 在Windows上使用APScheduler时未找到键为 'Asia/Taipei' 的时区
我在Windows上的FastAPI应用中使用APScheduler 3.10,当传入时区字符串时就会出现这个错误。
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
scheduler = BackgroundScheduler(timezone="Asia/Taipei")
scheduler.add_job(my_job, CronTrigger(hour=8, minute=0, timezone="Asia/Taipei"))
scheduler.start()
错误:
ZoneInfoNotFoundError: 'No time zone found with key Asia/Taipei'
在Linux/macOS上能正常工作,但在Windows上会失败。
我已经尝试了:
- 安装tzdata
- 设置TZDIR环境变量
我想了解为什么Windows上会这样,以及在使用Asia/Taipei的 APScheduler时,最可靠的修复方法是什么。
解决方案
在Windows上的可靠修复方法是传入一个pytz时区对象,而不是时区字符串。
示例:
import pytz
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
tz = pytz.timezone("Asia/Taipei")
scheduler = BackgroundScheduler(timezone=tz)
scheduler.add_job(
my_job,
trigger=CronTrigger(hour=8, minute=0, timezone=tz),
)
scheduler.start()
之所以这样有效:
- 在Windows上,如果时区数据库没有按预期方式可用,标准的zoneinfo解析IANA名称可能会失败。
- pytz使用它自带的时区数据库,因此传入pytz时区对象就能避免从字符串到ZoneInfo的查找问题。
就我而言,将 "Asia/Taipei" 作为字符串改为pytz.timezone("Asia/Taipei") 就解决了这个问题。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。