date_util.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. from datetime import datetime, timedelta
  2. from typing import Optional, Tuple
  3. class DateUtil:
  4. """日期时间工具类"""
  5. @staticmethod
  6. def get_current_time() -> datetime:
  7. """获取当前时间
  8. Returns:
  9. 当前时间
  10. """
  11. return datetime.now()
  12. @staticmethod
  13. def format_date(date: datetime, fmt: str = '%Y-%m-%d %H:%M:%S') -> str:
  14. """格式化日期时间
  15. Args:
  16. date: 日期时间对象
  17. fmt: 格式化字符串
  18. Returns:
  19. 格式化后的日期时间字符串
  20. """
  21. return date.strftime(fmt)
  22. @staticmethod
  23. def parse_date(date_str: str,
  24. fmt: str = '%Y-%m-%d %H:%M:%S') -> Optional[datetime]:
  25. """解析日期时间字符串
  26. Args:
  27. date_str: 日期时间字符串
  28. fmt: 格式化字符串
  29. Returns:
  30. 解析后的日期时间对象,如果解析失败返回None
  31. """
  32. try:
  33. return datetime.strptime(date_str, fmt)
  34. except ValueError:
  35. return None
  36. @staticmethod
  37. def get_date_range(start_date: datetime,
  38. end_date: datetime) -> Tuple[datetime, datetime]:
  39. """获取日期范围
  40. Args:
  41. start_date: 开始日期
  42. end_date: 结束日期
  43. Returns:
  44. 包含开始日期和结束日期的元组
  45. """
  46. return (start_date, end_date)
  47. @staticmethod
  48. def add_days(date: datetime, days: int) -> datetime:
  49. """增加天数
  50. Args:
  51. date: 日期时间对象
  52. days: 要增加的天数
  53. Returns:
  54. 增加天数后的日期时间对象
  55. """
  56. return date + timedelta(days=days)
  57. @staticmethod
  58. def get_week_start_end(date: datetime) -> Tuple[datetime, datetime]:
  59. """获取指定日期所在周的起始和结束日期
  60. Args:
  61. date: 日期时间对象
  62. Returns:
  63. 包含周起始日期和结束日期的元组
  64. """
  65. start = date - timedelta(days=date.weekday())
  66. end = start + timedelta(days=6)
  67. return (start, end)
  68. @staticmethod
  69. def is_leap_year(year: int) -> bool:
  70. """判断是否为闰年
  71. Args:
  72. year: 年份
  73. Returns:
  74. bool: 是否为闰年
  75. """
  76. return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
  77. @staticmethod
  78. def get_days_in_month(year: int, month: int) -> int:
  79. """获取指定月份的天数
  80. Args:
  81. year: 年份
  82. month: 月份
  83. Returns:
  84. 指定月份的天数
  85. """
  86. if month == 2:
  87. return 29 if DateUtil.is_leap_year(year) else 28
  88. elif month in [4, 6, 9, 11]:
  89. return 30
  90. else:
  91. return 31