#!/usr/bin/python3.6 # -*- coding: utf-8 -*- # # Copyright (C) 2022 # # @Time : 2022/3/26 16:20 # @Author : ming # @Email : zhangdongming@asj6.wecom.work # @File : LocalDateTimeUtil.py # @Software: PyCharm import calendar import datetime import time from dateutil.relativedelta import relativedelta def get_cur_month(): # 获取当前月 return datetime.datetime.now().strftime("%Y-%m") def get_last_month_num(number=1): # 获取前几个月 month_date = datetime.datetime.now().date() - relativedelta(months=number) return month_date.strftime("%Y-%m") def get_next_month(number=1): # 获取后几个月 month_date = datetime.datetime.now().date() + relativedelta(months=number) return month_date.strftime("%Y-%m") def get_cur_month_start(): # 获取当前月的第一天 month_str = datetime.datetime.now().strftime('%Y-%m') return '{}-01'.format(month_str) def get_cur_month_end(): # 获取当前月的最后一天 """ param: month_str 月份,2021-04 """ # return: 格式 %Y-%m-%d month_str = datetime.datetime.now().strftime('%Y-%m') year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1]) end = calendar.monthrange(year, month)[1] return '{}-{}-{}'.format(year, month, end) def get_last_month_start(month_str=None): # 获取上一个月的第一天 """ param: month_str 月份,2021-04 """ # return: 格式 %Y-%m-%d if not month_str: month_str = datetime.datetime.now().strftime('%Y-%m') year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1]) if month == 1: year -= 1 month = 12 else: month -= 1 return '{}-{}-01'.format(year, month) def get_next_month_start(month_str=None): # 获取下一个月的第一天 """ param: month_str 月份,2021-04 """ # return: 格式 %Y-%m-%d if not month_str: month_str = datetime.datetime.now().strftime('%Y-%m') year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1]) if month == 12: year += 1 month = 1 else: month += 1 return '{}-{}-01'.format(year, month) def get_last_month_end(month_str=None): # 获取上一个月的最后一天 """ param: month_str 月份,2021-04 """ # return: 格式 %Y-%m-%d if not month_str: month_str = datetime.datetime.now().strftime('%Y-%m') year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1]) if month == 1: year -= 1 month = 12 else: month -= 1 end = calendar.monthrange(year, month)[1] return '{}-{}-{}'.format(year, month, end) def get_next_month_end(month_str=None): # 获取下一个月的最后一天 """ param: month_str 月份,2021-04 """ # return: 格式 %Y-%m-%d if not month_str: month_str = datetime.datetime.now().strftime('%Y-%m') year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1]) if month == 12: year += 1 month = 1 else: month += 1 end = calendar.monthrange(year, month)[1] return '{}-{}-{}'.format(year, month, end) def get_last_first_date_and_last_date(n): """ 获取前n周开始时间和结束时间,参数n:代表前n周 """ now = datetime.datetime.now() # 上周第一天和最后一天 before_n_week_start = now - datetime.timedelta(days=now.weekday() + 7 * n, hours=now.hour, minutes=now.minute, seconds=now.second, microseconds=now.microsecond) # last_week_end = now - timedelta(days=now.weekday() + 1) before_n_week_end = before_n_week_start + datetime.timedelta(days=6, hours=23, minutes=59, seconds=59) return before_n_week_start, before_n_week_end def get_today_date(timestamp=False): """ 返回当天开始时间和结束时间 Args: timestamp 是否返回时间戳 returns: zero_today ,last_today """ now = datetime.datetime.now() zero_today = now - datetime.timedelta(hours=now.hour, minutes=now.minute, seconds=now.second, microseconds=now.microsecond) last_today = zero_today + datetime.timedelta(hours=23, minutes=59, seconds=59) if timestamp: zero_today = int(time.mktime(zero_today.timetuple())) last_today = int(time.mktime(last_today.timetuple())) return zero_today, last_today return zero_today, last_today def get_last_week(): """ 获取前一周时间 @return: last_week_date """ today = datetime.date.today() # 1. 获取「今天」 last_week = today - datetime.timedelta(days=7) # 2.获取7天前 last_week_date = last_week.strftime("%Y-%m-%d %H:%M:%S") return last_week_date def get_last_month(): """ 获取前一个月时间 returns: last_month_date """ today = datetime.date.today() # 1. 获取「今天」 last_month = today.replace(month=today.month - 1) # 2.获取前一个月 last_month_date = last_month.strftime("%Y-%m-%d %H:%M:%S") return last_month_date def get_before_days_timestamp(timestamp, days=1): """ 获取之前日期时间戳-秒级 @param timestamp: 时间戳 @param days: 天数 @return: (timestamp - second * hour * days) 时间戳 """ if days: second = 3600 hour = 24 if days > 0: return timestamp - second * hour * days return 0 def get_after_days_timestamp(timestamp, days=1): """ 获取之后日期时间戳-秒级 @param timestamp: 时间戳 @param days: 天数 @return: (timestamp + second * hour * days) 时间戳 """ if days: second = 3600 hour = 24 if days > 0: return timestamp + second * hour * days return 0 def date_to_week(str_date): """ 日期获取星期几 @param str_date 日期 例:2022-03-03 @return: int 1-7 """ if str_date: return datetime.datetime.strptime(str_date, "%Y-%m-%d").weekday() + 1 return datetime.datetime.now().weekday() + 1 def format_date_to_week(str_date, str_format): """ 日期获取星期几 @param str_format: %Y-%m-%d @param str_date 日期 例:2022-03-03 @return: int 1-7 """ if str_date: return datetime.datetime.strptime(str_date, str_format).weekday() + 1 return 0 def get_start_and_end_time(date, str_format): """ 根据日期获取当日开始and结束时间戳 @param date: 日期 例:2022-03-07 @param str_format: 格式 例:%Y-%m-%d @return: start_time,end_time """ if date: today = datetime.datetime.strptime(date, str_format) day = today + datetime.timedelta(days=1) start_time = int(time.mktime(time.strptime(str(today.date()), '%Y-%m-%d'))) end_time = int(time.mktime(time.strptime(str(day.date()), '%Y-%m-%d'))) - 1 return start_time, end_time return 0 def time_stamp_to_time(time_stamp, time_format): """ 时间戳转时间 @param time_stamp: 时间戳 @param time_format: 时间格式 例%Y-%m-%d %H:%M:%S @return: 格式化后时间字符串 """ time_array = time.localtime(time_stamp) return time.strftime(time_format, time_array) def time_format_date(timestamp, tz): # 解析时区偏移量 tz_hours, tz_minutes = map(int, tz.split(':')) # 将时间戳转换为 datetime 对象 dt = datetime.datetime.fromtimestamp(timestamp) # 创建 timedelta 对象,表示时区偏移量 tz_offset = datetime.timedelta(hours=tz_hours, minutes=tz_minutes) # 调整 datetime 对象的时区 dt = dt + tz_offset # 格式化日期时间字符串 formatted_date = dt.strftime('%Y-%m-%d %H:%M:%S') return formatted_date def start_of_day_timestamp(timestamp): # 将当前时间戳转换为 datetime 对象 dt = datetime.datetime.fromtimestamp(timestamp) # 获取日期部分,并将时、分、秒和微秒设置为零 dt_start_of_day = dt.replace(hour=0, minute=0, second=0, microsecond=0) return int(dt_start_of_day.timestamp()) def get_previous_month_first_day(timestamp): # 将时间戳转换为datetime对象 dt = datetime.datetime.fromtimestamp(timestamp) # 获取上个月的年份和月份 previous_month_year = dt.year if dt.month > 1 else dt.year - 1 previous_month = dt.month - 1 if dt.month > 1 else 12 # 构造上个月第一天的datetime对象 previous_month_first_day = datetime.datetime(previous_month_year, previous_month, 1) # 将上个月第一天的datetime对象转换为时间戳并返回 return int(previous_month_first_day.timestamp()) def get_current_month_first_day(timestamp): # 将时间戳转换为datetime对象 dt = datetime.datetime.fromtimestamp(timestamp) # 获取当前月份的年份和月份 current_month_year = dt.year current_month = dt.month # 构造当前月份第一天的datetime对象 current_month_first_day = datetime.datetime(current_month_year, current_month, 1) # 将当前月份第一天的datetime对象转换为时间戳并返回 return int(current_month_first_day.timestamp()) def get_date_time(timestamp, timezone_offset): # 计算时区偏移量 hours_offset = int(timezone_offset[1:3]) minutes_offset = int(timezone_offset[4:6]) offset = datetime.timedelta(hours=hours_offset, minutes=minutes_offset) # 转换为日期时间对象 return datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone(offset))