timezone_utils.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. """
  2. 时区工具模块
  3. 提供东八区(Asia/Shanghai,UTC+8,无夏令时)时间处理功能
  4. """
  5. from datetime import datetime, timedelta, timezone
  6. # 东八区:Asia/Shanghai 不使用夏令时,固定 UTC+8 即可
  7. CHINA_TZ = timezone(timedelta(hours=8))
  8. UTC = timezone.utc
  9. def now_china() -> datetime:
  10. """
  11. 获取当前东八区时间(带时区信息)
  12. Returns:
  13. datetime: 当前东八区时间
  14. """
  15. return datetime.now(CHINA_TZ)
  16. def now_china_naive() -> datetime:
  17. """
  18. 获取当前东八区时间(不带时区信息,用于数据库存储)
  19. Returns:
  20. datetime: 当前东八区时间(naive datetime)
  21. """
  22. return datetime.now(CHINA_TZ).replace(tzinfo=None)
  23. def to_china_time(dt: datetime) -> datetime:
  24. """
  25. 将任意时区的时间转换为东八区时间
  26. Args:
  27. dt: 输入的datetime对象
  28. Returns:
  29. datetime: 转换后的东八区时间
  30. """
  31. if dt.tzinfo is None:
  32. dt = dt.replace(tzinfo=UTC)
  33. return dt.astimezone(CHINA_TZ)
  34. def utc_to_china_naive(dt: datetime) -> datetime:
  35. """
  36. 将UTC时间转换为东八区时间(不带时区信息)
  37. Args:
  38. dt: UTC时间
  39. Returns:
  40. datetime: 东八区时间(naive datetime)
  41. """
  42. if dt.tzinfo is None:
  43. dt = dt.replace(tzinfo=UTC)
  44. return dt.astimezone(CHINA_TZ).replace(tzinfo=None)