时间转化的相关方法
将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