# -*- coding: utf-8 -*- """ @File : day.py @Time : 2023/1/14 17:06 @Author : geekbing @LastEditTime : - @LastEditors : - @Description : - """ import datetime from httprunner.builtin import get_ts_int def get_day(days: int = 0, **kwargs): """ 获取日期,默认有连接符 :param days: 间隔时间 :param kwargs: :return: >>> get_day() # 今天的日期 2023-02-01 >>> get_day(1) # 明天的日期 >>> get_day(-1) # 昨天的日期 >>> get_day(h=9,m=15,s=30) # 今天的9时15分30秒 20230116 9:15:30 """ d = datetime.timedelta(days) n = datetime.datetime.now() time_str = f"%Y-%m-%d" if kwargs: h = kwargs.get("h", "00") m = kwargs.get("m", "00") s = kwargs.get("s", "00") time_str = f"{time_str} {h}:{m}:{s}" return (n + d).strftime(time_str) def get_month(month_delta: int = 0, base_ts=get_ts_int) -> str: """生成年月 :param month_delta: 间隔月份 :param base_ts: 基准时间 :return: >>> base_ts = 1629439316 # 2021-08-20 14:01:56 >>> get_month(5, base_ts) '202201' >>> get_month(17, base_ts) '202301' >>> get_month(-20, base_ts) '201912' >>> get_month(-8, base_ts) '202012' >>> get_month(base_ts=base_ts) '202108' >>> get_month(1, base_ts) '202109' >>> get_month(-1, base_ts) '202107' """ if callable(base_ts): base_ts = base_ts() dt = datetime.datetime.fromtimestamp(base_ts) year, month = dt.year, dt.month # 超过12个月,先计算年份,然后再对月份差取余 if abs(month_delta) > 12: year_delta = abs(month_delta) // 12 if month_delta > 0: year += year_delta month_delta = month_delta % 12 else: year -= year_delta month_delta = -(abs(month_delta) % 12) # 月份差是正数,有两种情况 # 1.月份差和当前的月份相加 > 12, 年份+1, 月份等于超过的减去12 # 2.月份差和当前月份相加 <= 12, 直接相加 if month_delta >= 0: if month + month_delta > 12: year += 1 month = month + month_delta - 12 else: month += month_delta else: # 月份差是负数, 有两种情况 # 1.月份差 <= 0, 年份-1, 月份从12开始倒退 # 2.直接倒退月份 if month - abs(month_delta) <= 0: year -= 1 # month + month_delta 是负数 month = 12 + (month + month_delta) else: month += month_delta month = str(month).rjust(2, "0") return f"{year}{month}" def get_week(weeks: int = 0) -> str: """ 生成一年中的第n周 :param weeks: :return: """ week_delta = 7 * 24 * 60 * 60 * weeks ts = get_ts_int(week_delta) dt = datetime.datetime.fromtimestamp(ts) year, week_number, _ = dt.isocalendar() # 确保周数是两位数,例如 '01', '02', ..., '11', '12', ... week_str = str(week_number).zfill(2) # '202333' 2023年的第33周 return f"{year}{week_str}" def get_month_format(month_delta: int = 0, base_ts=get_ts_int): """ :param month_delta: :param base_ts: :return: """ month = get_month(month_delta, base_ts) return f"{month[:4]}年{month[4:]}月" def get_week_format(weeks: int) -> str: """ :param weeks: :return: """ week = get_week(weeks) return f"{week[:4]}年{week[4:]}周"