123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- from datetime import datetime, timedelta
- from typing import Optional, Tuple
- class DateUtil:
- """日期时间工具类"""
- @staticmethod
- def get_current_time() -> datetime:
- """获取当前时间
-
- Returns:
- 当前时间
- """
- return datetime.now()
- @staticmethod
- def format_date(date: datetime, fmt: str = '%Y-%m-%d %H:%M:%S') -> str:
- """格式化日期时间
-
- Args:
- date: 日期时间对象
- fmt: 格式化字符串
-
- Returns:
- 格式化后的日期时间字符串
- """
- return date.strftime(fmt)
- @staticmethod
- def parse_date(date_str: str,
- fmt: str = '%Y-%m-%d %H:%M:%S') -> Optional[datetime]:
- """解析日期时间字符串
-
- Args:
- date_str: 日期时间字符串
- fmt: 格式化字符串
-
- Returns:
- 解析后的日期时间对象,如果解析失败返回None
- """
- try:
- return datetime.strptime(date_str, fmt)
- except ValueError:
- return None
- @staticmethod
- def get_date_range(start_date: datetime,
- end_date: datetime) -> Tuple[datetime, datetime]:
- """获取日期范围
-
- Args:
- start_date: 开始日期
- end_date: 结束日期
-
- Returns:
- 包含开始日期和结束日期的元组
- """
- return (start_date, end_date)
- @staticmethod
- def add_days(date: datetime, days: int) -> datetime:
- """增加天数
-
- Args:
- date: 日期时间对象
- days: 要增加的天数
-
- Returns:
- 增加天数后的日期时间对象
- """
- return date + timedelta(days=days)
- @staticmethod
- def get_week_start_end(date: datetime) -> Tuple[datetime, datetime]:
- """获取指定日期所在周的起始和结束日期
-
- Args:
- date: 日期时间对象
-
- Returns:
- 包含周起始日期和结束日期的元组
- """
- start = date - timedelta(days=date.weekday())
- end = start + timedelta(days=6)
- return (start, end)
- @staticmethod
- def is_leap_year(year: int) -> bool:
- """判断是否为闰年
-
- Args:
- year: 年份
-
- Returns:
- bool: 是否为闰年
- """
- return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
- @staticmethod
- def get_days_in_month(year: int, month: int) -> int:
- """获取指定月份的天数
-
- Args:
- year: 年份
- month: 月份
-
- Returns:
- 指定月份的天数
- """
- if month == 2:
- return 29 if DateUtil.is_leap_year(year) else 28
- elif month in [4, 6, 9, 11]:
- return 30
- else:
- return 31
|