a63bd6874c
- 新增 is_working_day() 工具函数,自动跳过周末 + 可配置法定假日 - 仪表盘填报进度新增 is_rest_day 字段,休息日显示灰「休」印章 - 催办调度改用 is_working_day() 替代原始 weekday 检查 - 系统设置新增「法定节假日」配置卡片,支局长可管理假日日期 Co-Authored-By: Claude <noreply@anthropic.com>
32 lines
997 B
Python
32 lines
997 B
Python
from datetime import date, datetime, timezone, timedelta
|
|
|
|
CST = timezone(timedelta(hours=8)) # China Standard Time
|
|
|
|
|
|
def today_cst() -> date:
|
|
"""Get today's date in Asia/Shanghai timezone."""
|
|
return datetime.now(timezone.utc).astimezone(CST).date()
|
|
|
|
|
|
def parse_date(s: str) -> date:
|
|
"""Parse a date string that may be YYYY-MM-DD or a full ISO datetime."""
|
|
return date.fromisoformat(s[:10])
|
|
|
|
|
|
def is_working_day(d: date | None = None, holidays: set[date] | None = None) -> bool:
|
|
"""Check if a date is a Chinese working day.
|
|
|
|
Returns False for:
|
|
- Saturdays and Sundays (weekday >= 5)
|
|
- Dates in the holidays set (configurable via system_config)
|
|
|
|
Note: makeup workdays (调休, where Saturday/Sunday becomes a workday)
|
|
are not currently handled. If needed, add a 'workdays' config set.
|
|
"""
|
|
d = d or today_cst()
|
|
if d.weekday() >= 5: # Saturday or Sunday
|
|
return False
|
|
if holidays and d in holidays:
|
|
return False
|
|
return True
|