python - 时间转化的相关方法

时间转化的相关方法

将UTC时间转为本地时间(str-str)

def dt_convert(value, return_format='%Y-%m-%d %H:%M:%S'):
    """
    UTC时间转为本地时间
    """
    if not value:
        return value
    if isinstance(value, datetime):
        value = value.strftime(return_format)
    dt = datetime.strptime(value, return_format)
    pytz_timezone = pytz.timezone('Asia/Shanghai')
    dt = dt.replace(tzinfo=pytz.timezone('UTC'))
    return dt.astimezone(pytz_timezone).strftime(return_format)


获取当前时间(->str)

def get_now_datetime(is_utc=False, date_format="%Y-%m-%d %H:%M:%S") -> str:
    """
    获取当前时间,字符串形式的 datetime
    """
    # 获取当前的 UTC 时间
    utc_now = datetime.now(pytz.utc)
    if is_utc:
        return utc_now.strftime(date_format)
    else:
        return (utc_now + timedelta(hours=8)).strftime(date_format)

将时间戳转换为字符串时间(int->str)

def convert_timestramp_to_strDate(
    ts: int, is_utc: bool = False, date_format: str = "%Y-%m-%d %H:%M:%S"
) -> str:
    """
    转换时间戳时间为字符串时间
    """
    tz = pytz.utc if is_utc else pytz.timezone("Asia/Shanghai")
    _dt = datetime.fromtimestamp(ts, tz)

    return _dt.strftime(date_format)

将东八区的时间列表转换为0时区的数据(list[str, str] -> str, str)

入参:[“2020-01-01 08:00:00”, “2020-01-01 16:00:00”]

返回:“2020-01-01 00:00:00”, “2020-01-01 08:00:00”

def convert_str_date_to_search(date_li: List[str]):
    """
    获取字符串形式的东八区 date 时间列表
    转换为 0 时区的 datetime 时间形式字符串
    """

    def _serial_date(str_date: str, is_end: bool = False):
        days = 1 if is_end else 0
        return (
            datetime.strptime(str_date, "%Y-%m-%d") + timedelta(days=days, hours=-8)
        ).strftime("%Y-%m-%d %H:%M:%S")

    return _serial_date(date_li[0]), _serial_date(date_li[1], True)


转换 东八区 字符串格式的datetime,为 0时区 的字符串时间

def convert_utc_tz_by_datetime(str_date: str):
    """
    转换 东八区 字符串格式的datetime,为 0时区 的字符串时间
    """
    if not str_date:
        return None

    return operate_str_datetime(str_date, -8)

将字符串时间增减指定时间(str -> str)

入参:“2023-01-01 00:00:00”, 8

返回:“2023-01-01 08:00:00”

def operate_str_datetime(str_dt: str, hour: int, f="%Y-%m-%d %H:%M:%S"):
    """
    对字符串格式的 datetime 增减指定时间(hour)
    """

    return (
            datetime.strptime(str_dt, f) + timedelta(hours=hour)
    ).strftime(f)

获取当前时间 utc

def get_now_datetime_utc():
    # 获取当前时间
    current_time = datetime.now()
    # 将当前时间转换为UTC时间
    utc_time = current_time.astimezone(timezone.utc)

    return utc_time

获取几天前的 utc 时间

def get_str_day_by_offset(daily: int, tf: str = "%Y-%m-%d %H:%M:%S"):
    """
    获取 几天(daily) 前的utc日期
    """
    utc_time = get_now_datetime_utc()

    d = utc_time + timedelta(days=daily)

    return d.strftime(tf)

获取指定间隔时间的日期序列

import datetime

time_format_all = "%Y-%m-%d %H:%M:%S"
time_format_day = "%Y-%m-%d"


def return_datetime_range_by_5minutes(begin_dt, step):
    """
    从指定的日期开始, 获取之后的每5分钟的 datetime 时间
    begin_dt: "2022-10-26 12:30:00"
    step: 20

    :return:
        [
            ['2022-10-26 12:30:00', '2022-10-26 12:35:00'],
            ['2022-10-26 12:35:00', '2022-10-26 12:40:00'],
            ...
        ]

    """
    dd = datetime.datetime.strptime(begin_dt, time_format_all)

    return [
        [
            f"{str(dd + datetime.timedelta(minutes=i*5)).rsplit(':',1)[0]}:00",
            f"{str(dd + datetime.timedelta(minutes=(i+1)*5)).rsplit(':',1)[0]}:00",
        ]
        for i in range(step)
    ]

    
    


def return_range_by_30minutes_datetime(start_dt, end_dt):
    """
    获取两个日期之间的 datetime 30分钟的时间列表
    :param start_dt:  2022-10-01 00:00:00
    :param end_dt: 2022-10-10 00:00:00
    :return: ['2022-10-01 00:00:00', '2022-10-02 00:30:00', ...]
    """
    dates = []
    dt = datetime.datetime.strptime(start_dt, time_format_all)
    date = start_dt[:]

    while date <= end_dt:
        dates.append(date)
        dt = dt + datetime.timedelta(minutes=30)

        date = dt.strftime(time_format_all)
    return dates


def return_range_by_minutes_datetime(start_dt: str, end_dt: str, minute: int):
    """
    获取两个日期之间 指定分钟 的 datetime 的时间列表
    :param minute: 60 or 30
    :param start_dt:  2022-10-01 00:00:00
    :param end_dt: 2022-10-10 00:00:00
    :return: ['2022-10-01 00:00:00', '2022-10-02 00:30:00', ...]
    """
    dates = []
    dt = datetime.datetime.strptime(start_dt, time_format_all)
    date = start_dt[:]

    while date <= end_dt:
        dates.append(date)
        dt = dt + datetime.timedelta(minutes=minute)

        date = dt.strftime(time_format_all)
    return dates


获取两个字符串日期之间的时间列表

import datetime

time_format_all = "%Y-%m-%d %H:%M:%S"
time_format_day = "%Y-%m-%d"

def return_range_day_datetime(start_dt, end_dt):
    """
    获取两个日期之间的 datetime 日期列表
    :param start_dt:  2022-10-01 00:00:00
    :param end_dt: 2022-10-10 00:00:00
    :return: ['2022-10-01 00:00:00', '2022-10-02 00:00:00', ...]
    """
    dates = []
    dt = datetime.datetime.strptime(start_dt, time_format_all)

    date = start_dt[:]

    while date <= end_dt:
        dates.append(date)
        dt = dt + datetime.timedelta(1)

        date = dt.strftime(time_format_all)
    return dates

  
def return_range_day_date(start_dt: str, end_dt):
    """
    获取两个日期之间的 date 日期列表
    :param start_dt:  2022-10-01 00:00:00
    :param end_dt: 2022-10-10 00:00:00
    :return: ['2022-10-01', '2022-10-02', ...]
    """
    start_dt = start_dt.split(" ")[0]
    dates = []
    dt = datetime.datetime.strptime(start_dt, time_format_day)
    date = start_dt[:]

    while date <= end_dt:
        dates.append(date)
        dt = dt + datetime.timedelta(1)

        date = dt.strftime(time_format_day)
    return dates

获取两个日期间的时间

time_format_all = "%Y-%m-%d %H:%M:%S"

def return_interval_day(start_dt: str, end_dt: str):
    """
    返回间隔的日期时间
    :param start_dt: 2022-10-01 00:00:00
    :param end_dt: 2022-10-12 00:00:00
    :return: 12
    """

    sdt = datetime.datetime.strptime(start_dt, time_format_all)
    edt = datetime.datetime.strptime(end_dt, time_format_all)

    return (edt - sdt).days


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值