# -*- coding: utf-8 -*- from datetime import datetime, timedelta class DateUtils: formatter = '%Y-%m-%d %H:%M:%S' @staticmethod def time_to_str(time: datetime) -> str: """格式化为字符串""" return time.strftime(DateUtils.formatter) @staticmethod def str_to_time(time_str: str) -> str: """字符串转时间格式""" if isinstance(time_str, str): return datetime.strptime(time_str, DateUtils.formatter) @staticmethod def time_check(time): """时间格式检查, 允许接收字符串和datetime两种格式""" if isinstance(time, str): return DateUtils.str_to_time(time) elif not isinstance(time, datetime): return False else: return time @staticmethod def now() -> str: """返回当前日期时间""" return datetime.now() @staticmethod def now_time() -> str: """返回当前日期时间 Returns: str: 当前日期时间 """ return DateUtils.time_to_str(datetime.now()) @staticmethod def time_slice(start_time, end_time, hour: int) -> list: """时间分割,根据给定的时间段和每段时长,将总时段分割为多端时间段""" st = DateUtils.time_check(start_time) et = DateUtils.time_check(end_time) if (st == False) or (et == False): return [] result = [] current_time = st while current_time < et: next_time = current_time + timedelta(hours=hour) # 当加了8小时的时间仍然小于结束时间,将此段时间加入结果 if next_time < et: s = current_time e = next_time - timedelta(seconds=1) result.append((s, e)) current_time = next_time # 否则把current_time和end_time作为最后一组时段加入结果并退出循环 else: s = current_time e = et result.append((s, e)) break return result @staticmethod def time_distance(time1, time2=datetime.now(), type: str = "day") -> int: """时间相差几天 Args: time1 (str): 时间1 time2 (str): 时间2 Returns: int: 相差的天数 """ date1 = DateUtils.time_check(time1) date2 = DateUtils.time_check(time2) if date1 == False or date2 == False: return -1 time_diff = abs(date2 - date1) if type == "day": return time_diff.days elif type == "hour": return time_diff.days*24 + time_diff.seconds / 3600 @staticmethod def today_0am() -> datetime: """获取今日0点""" return datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) @staticmethod def today_0am() -> datetime: """获取今日0点""" return datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)