- 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
37 lines
1.1 KiB
Python
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")
|