date_range.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. """按自然日(YYYY-MM-DD)解析为 [day_start, day_end) 的 create_time 筛选条件。"""
  2. from datetime import datetime, timedelta
  3. def current_month_bounds(now: datetime | None = None) -> tuple[datetime, datetime]:
  4. """当前自然月 [month_start, next_month_start),与服务器本地时间一致(项目约定 Asia/Shanghai)。"""
  5. if now is None:
  6. now = datetime.now()
  7. month_start = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
  8. if now.month == 12:
  9. month_end = datetime(now.year + 1, 1, 1)
  10. else:
  11. month_end = datetime(now.year, now.month + 1, 1)
  12. return month_start, month_end
  13. def parse_create_time_day_bounds(apply_date: str | None) -> tuple[datetime, datetime] | None:
  14. if not apply_date or not str(apply_date).strip():
  15. return None
  16. try:
  17. day_start = datetime.strptime(str(apply_date).strip(), "%Y-%m-%d")
  18. return day_start, day_start + timedelta(days=1)
  19. except ValueError:
  20. return None
  21. def resolve_apply_create_time(apply_date: str | None, now: datetime | None = None) -> datetime:
  22. """申请日 YYYY-MM-DD → create_time;当天用当前时刻,其它日期用当日 0 点。"""
  23. if now is None:
  24. now = datetime.now()
  25. bounds = parse_create_time_day_bounds(apply_date)
  26. if not bounds:
  27. return now
  28. day_start, _ = bounds
  29. if day_start.date() == now.date():
  30. return now
  31. return day_start