Files
news/scheduler/timeutil.py
T
simon 7b33182f67 fix: 修复补跑误含 cninfo 三步与时区不一致 (P1-2/P1-3)
- P1-2: 提取 DEFAULT_NEWS_STEPS(全链路去 report+cninfo),定时/补跑/默认三处统一;
  启动补跑不再误执行 cninfo 公告管道
- P1-3: 新增 scheduler/timeutil.py(调度时区统一入口,SCHEDULE_TZ 可覆盖,
  默认 Asia/Shanghai);run_scheduler 定时/补跑/--once、crawler 补跑保护、
  reporter 兜底日期全部改用调度时区,避免系统时区非上海时日期错位
- 新增 6 个测试;全量 282 passed
2026-08-23 05:40:52 +08:00

37 lines
1.1 KiB
Python

"""调度时区工具。
背景(P1-3):
定时任务 cron 触发时区与"今天"的判定必须一致。此前 cron 用
Asia/Shanghai,而 `date.today()` / `datetime.now()` 取系统时区——
若系统时区不是 Asia/Shanghai(如 UTC),07:00 上海(=前一日 23:00 UTC)
触发时 `date.today()` 会返回错误日期,整条 pipeline 落在错日目录。
统一入口:
schedule_tz(): 调度时区(env SCHEDULE_TZ 可覆盖,默认 Asia/Shanghai)
today_str(): 按调度时区返回 YYYYMMDD
"""
from __future__ import annotations
import os
from datetime import datetime
from zoneinfo import ZoneInfo
# 默认调度时区(与 .env 的 SCHEDULE_TIMES 语义一致)
DEFAULT_SCHEDULE_TZ = "Asia/Shanghai"
def schedule_tz() -> ZoneInfo:
"""调度时区(env SCHEDULE_TZ 可覆盖,默认 Asia/Shanghai)。"""
return ZoneInfo(os.environ.get("SCHEDULE_TZ") or DEFAULT_SCHEDULE_TZ)
def now() -> datetime:
"""当前时刻(调度时区,aware)。"""
return datetime.now(schedule_tz())
def today_str() -> str:
"""按调度时区返回今天的 YYYYMMDD。"""
return now().strftime("%Y%m%d")