time_util.py 6.13 KB
# encoding: utf-8
import calendar
import time
from datetime import datetime
import pytz

YMDHMS_FORMAT = "%Y-%m-%d %H:%M:%S"
YMDHMS_FORMAT_ZONE8 = "%Y-%m-%d %H:%M:%S+8:00"
YMD_FORMAT = "%Y-%m-%d"
HMS_FORMAT = "%H:%M:%S"
YMD_SIMPLE = "%Y%m%d"
YMD = "%Y.%m.%d"
YMDHM_CN = "%Y年%m月%d日 %H:%M"

tz_sh = pytz.timezone('Asia/Shanghai')


def str2dt(datetime_str, time_format):
    return datetime.strptime(datetime_str, time_format)


def dt2str(date_time, time_format):
    return date_time.strftime(time_format)


def ts_second_2str(ts_second, time_format):
    return ts_second_to_dt(ts_second).strftime(time_format)


def ts_mills_2str(ts_mills, time_format):
    return ts_second_2str(ts_mills / 1000, time_format)


def dt2ts_mills(date_time):
    return int(time.mktime(date_time.timetuple())) * 1000


def ts_second_to_dt(ts_second):
    return datetime.fromtimestamp(ts_second)


def ts_mills_to_dt(ts_mills):
    return datetime.fromtimestamp(ts_mills / 1000)


def dt2ts_second(dt):
    """
    时间转换为时间戳(单位秒)
    """
    return int(time.mktime(dt.timetuple()))


def now():
    """ 上海时区当前时间 """
    return datetime.now(tz_sh).replace(tzinfo=None)


def now_str(time_format):
    return dt2str(now(), time_format)


def now_ts_second():
    return dt2ts_second(now())


def now_ts_mills():
    return dt2ts_mills(now())


def get_run_time(args):
    import datetime
    run_time = (datetime.datetime.now() - datetime.timedelta(minutes=args)).strftime("%Y-%m-%d %H:%M:%S")
    return run_time


# def get_current_week():
#     """
#     给定一个日期-返回日期所在周的周一0点时间 和 周日23点59分59秒
#     :param date_str: 如:"2020-05-01"
#     :return: 给定一个日期-返回日期所在周的周一0点时间 和 周日23点59分59秒
#     """
#     import datetime
#     monday, sunday = datetime.date.today(), datetime.date.today()
#     one_day = datetime.timedelta(days=1)
#     while monday.weekday() != 0:
#         monday -= one_day
#     while sunday.weekday() != 6:
#         sunday += one_day
#
#     week_dict = {
#         'monday': monday,
#         'sunday': sunday
#     }
#     return week_dict

def get_current_week(data_dt):
    """
    给定一个日期-返回日期所在周的周一0点时间 和 周日23点59分59秒
    :param date_str: 如:"2020-05-01"
    :return: 给定一个日期-返回日期所在周的周一0点时间 和 周日23点59分59秒
    """
    import datetime
    now_time = datetime.datetime.strptime(data_dt + " 00:00:00", "%Y-%m-%d %H:%M:%S")
    monday = now_time - datetime.timedelta(days=now_time.weekday(), hours=now_time.hour,
                                            minutes=now_time.minute, seconds=now_time.second,
                                            microseconds=now_time.microsecond)
    sunday = monday + datetime.timedelta(days=6, hours=23, minutes=59, seconds=59)
    week_dict = {
            'monday': monday,
            'sunday': sunday
    }
    return week_dict
#


# def get_current_week(data_dt):
#     """
#     给定一个日期-返回日期所在上周五的0点时间 和 本周四23点59分59秒
#     :param date_str: 如:"2020-05-01"
#     :return: 给定一个日期-返回日期所在上周五的0点时间 和 本周四23点59分59秒
#     """
#     import datetime
#     now_time = datetime.datetime.strptime(data_dt + " 00:00:00", "%Y-%m-%d %H:%M:%S")
#     last_friday = now_time - datetime.timedelta(days=(now_time.weekday() + 3) % 7, hours=now_time.hour,
#                                             minutes=now_time.minute, seconds=now_time.second,
#                                             microseconds=now_time.microsecond)
#     thursday = last_friday + datetime.timedelta(days=6, hours=23, minutes=59, seconds=59)
#     week_dict = {
#             'last_friday': last_friday,
#             'thursday': thursday
#     }
#     return week_dict


# 获取周一至周日的日期
def get_monday_to_sunday(data_dt):
    """
    获取周一至周日的日期
    """
    import datetime
    now_time = datetime.datetime.strptime(data_dt + " 00:00:00", "%Y-%m-%d %H:%M:%S")
    monday = now_time - datetime.timedelta(days=(now_time.weekday()) % 7, hours=now_time.hour,
                                            minutes=now_time.minute, seconds=now_time.second,
                                            microseconds=now_time.microsecond)
    sunday = monday + datetime.timedelta(days=6, hours=23, minutes=59, seconds=59)
    week_dict = {
            'monday': monday,
            'sunday': sunday
    }
    return week_dict


# def get_current_week(data_dt):
#     """
#     给定一个日期-返回日期所在上周六的0点时间 和 本周五23点59分59秒
#     :param date_str: 如:"2020-05-01"
#     :return: 给定一个日期-返回日期所在上周六的0点时间 和 本周五23点59分59秒
#     """
#     import datetime
#     now_time = datetime.datetime.strptime(data_dt + " 00:00:00", "%Y-%m-%d %H:%M:%S")
#     last_saturday = now_time - datetime.timedelta(days=(now_time.weekday() + 2) % 7, hours=now_time.hour,
#                                             minutes=now_time.minute, seconds=now_time.second,
#                                             microseconds=now_time.microsecond)
#     friday = last_saturday + datetime.timedelta(days=6, hours=23, minutes=59, seconds=59)
#     week_dict = {
#             'last_saturday': last_saturday,
#             'friday': friday
#     }
#     return week_dict



def month_start_and_end(data_dt):
    """
    年份 date(2017-09-08格式)
    :param data_dt:
    :return:本月第一天日期和本月最后一天日期
    """
    if data_dt.count('-') != 2:
        raise ValueError('- is error')
    year, month = str(data_dt).split('-')[0], str(data_dt).split('-')[1]
    end = calendar.monthrange(int(year), int(month))[1]
    start_date = '%s-%s-01' % (year, month)
    end_date = '%s-%s-%s' % (year, month, end)
    month_dict = {
        'start_date': start_date,
        'end_date': end_date
    }
    return month_dict


if __name__ == "__main__":
    print(now())
    print(dt2str(now(), YMDHMS_FORMAT))
    print(str2dt('2021-05-01', YMD_FORMAT))
    print(get_monday_to_sunday('2021-08-23'))