datetime_parse.py 929 B

123456789101112131415161718192021222324252627
  1. """运输计划相关日期时间解析:前端 date-picker 仅传 YYYY-MM-DD。"""
  2. from __future__ import annotations
  3. from datetime import date, datetime, time
  4. from typing import Annotated, Optional
  5. from pydantic import BeforeValidator
  6. def parse_optional_plan_datetime(value: object) -> Optional[datetime]:
  7. if value is None:
  8. return None
  9. if isinstance(value, datetime):
  10. return value
  11. if isinstance(value, date):
  12. return datetime.combine(value, time.min)
  13. if isinstance(value, str):
  14. text = value.strip()
  15. if not text:
  16. return None
  17. if len(text) == 10 and text[4] == "-" and text[7] == "-":
  18. return datetime.strptime(text, "%Y-%m-%d")
  19. return datetime.fromisoformat(text.replace("Z", "+00:00"))
  20. raise ValueError("invalid datetime")
  21. OptionalPlanDateTime = Annotated[Optional[datetime], BeforeValidator(parse_optional_plan_datetime)]