timezone_utils.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. """
  2. 时区工具模块
  3. 提供东八区(Asia/Shanghai)时间处理功能
  4. """
  5. from datetime import datetime
  6. try:
  7. # Python 3.9+
  8. from zoneinfo import ZoneInfo
  9. except ImportError:
  10. # Python 3.8 使用 backports
  11. from backports.zoneinfo import ZoneInfo
  12. # 东八区时区
  13. CHINA_TZ = ZoneInfo("Asia/Shanghai")
  14. def now_china() -> datetime:
  15. """
  16. 获取当前东八区时间(带时区信息)
  17. Returns:
  18. datetime: 当前东八区时间
  19. """
  20. return datetime.now(CHINA_TZ)
  21. def now_china_naive() -> datetime:
  22. """
  23. 获取当前东八区时间(不带时区信息,用于数据库存储)
  24. Returns:
  25. datetime: 当前东八区时间(naive datetime)
  26. """
  27. return datetime.now(CHINA_TZ).replace(tzinfo=None)
  28. def to_china_time(dt: datetime) -> datetime:
  29. """
  30. 将任意时区的时间转换为东八区时间
  31. Args:
  32. dt: 输入的datetime对象
  33. Returns:
  34. datetime: 转换后的东八区时间
  35. """
  36. if dt.tzinfo is None:
  37. # 如果是naive datetime,假设它是UTC时间
  38. dt = dt.replace(tzinfo=ZoneInfo("UTC"))
  39. return dt.astimezone(CHINA_TZ)
  40. def utc_to_china_naive(dt: datetime) -> datetime:
  41. """
  42. 将UTC时间转换为东八区时间(不带时区信息)
  43. Args:
  44. dt: UTC时间
  45. Returns:
  46. datetime: 东八区时间(naive datetime)
  47. """
  48. if dt.tzinfo is None:
  49. dt = dt.replace(tzinfo=ZoneInfo("UTC"))
  50. return dt.astimezone(CHINA_TZ).replace(tzinfo=None)