def add_time(start_dt: datetime.date, delta, quantity): if isinstance(delta, Number): return start_dt + timedelta(seconds=delta * quantity) quantity = delta[0] * quantity if delta: if delta[1] == 'month': years = int(quantity / 12) months = quantity - years * 12 months_result = start_dt.month + months if months_result < 1: years -= 1 months_result += 12 elif 12 < months_result: years += 1 months_result -= 12 years_result = start_dt.year + years last_calendar_day = calendar.monthrange(years_result, months_result)[1] return start_dt.replace(day=min(start_dt.day, last_calendar_day), month=months_result, year=years_result) else: # elif delta[1] == 'year': return start_dt.replace(year=start_dt.year + quantity, ) log.warning('"None" timedelta supplied when adding time, ' 'not adding any time') return start_dt
def get_beginning_and_end_of_month(date: datetime.date): """ Get first and last day of a month :param date: date in a month to get the first and last date of :return: tuple of first and last day of a month """ start = date.replace(day=1) end = date.replace(day=calendar.monthrange(date.year, date.month)[1]) return start, end
def is_first_working_day(today: datetime.date) -> bool: """指定日がその月の最初の平日か判定する""" for target_day in range(1, today.day + 1): if is_working_day(today.replace(day=target_day)): if target_day == today.day: # その月で最初の平日である return True # その月で2回目以降の平日である return False # 平日ではない return False
def subtract_one_month(self, dt: datetime.date): dt1 = dt.replace(day=1) dt2 = dt1 - timedelta(days=1) dt3 = dt2.replace(day=1) return dt3