Python 时间相关处理

news/2025/1/15 12:57:33/

datetime

        from datetime import datetime, timedelta, date

        fmt:指定日期字符串的格式,其中%Y表示四位年份,%m表示两位月份,%d表示两位日

 

        将日期字符串转为日期对象

                datetime.striptime(date_str,fmt)

date_str = "2022-01-01"
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
print(date_obj)# 输出:2022-01-01 00:00:00

        将日期对象转为字符串

                datetime.striptime(fmt)

date_obj = datetime(2022, 1, 1)
date_str = date_obj.strftime("%Y-%m-%d")
print(date_str)# 输出:2022-01-01

        timedelta

                timedelta是datetime模块中的一个类,用于表示时间间隔(即时间差)。它可以用来进行时间的加减运算,并且可以表示不同单位的时间差,如天、小时、分钟。常用于对天的处理,例如前一天、后一天等。

timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

                天的间隔

from datetime import datetime, timedelta, datedelta = timedelta(days=1)
print(delta)# 输出: 1 day, 0:00:00date_obj = datetime(2022, 1, 1)
previous_day = date_obj - timedelta(days=1)
next_day = date_obj + timedelta(days=1)
print(previous_day)
print(next_day)# 输出:
# 2021-12-31 00:00:00
# 2022-01-02 00:00:00

relativedelta

        relativedelta是dateutil库中的一个类,用于计算两个日期之间的差距,并且可以实现灵活的日期运算。relativedelta相比timedelta更为灵活,可以实现更复杂的日期运算,如计算两个日期之间的年数、月数、星期数等

        dateutil属于第三方库,需要安装后才能使用。

from dateutil.relativedelta import relativedeltarelativedelta(years=0, months=0, days=0, weeks=0, hours=0, minutes=0, seconds=0, microseconds=0)

        月的间隔

date_obj = datetime(2022, 1, 1)
previous_month = date_obj - relativedelta(months=1)
next_month = date_obj + relativedelta(months=1)
print(previous_month)
print(next_month)# 输出
# 2021-12-01 00:00:00
# 2022-02-01 00:00:00

其他功能

        博主也总结了自己常用的几个功能,封装成了函数,供大家参考使用

        分别是三个功能:拆分年月日时分秒、拆分年月日、获取两个时间间隔的日期列表

from datetime import datetime, timedeltafrom ProjectStart.set_logger import USE_LOGGER# 拆分为年月日 与 时分秒
def handle_date_and_time(start_time, end_time, fmt='%Y-%m-%d %H:%M:%S'):"""将传入的开始和结束时间,转为字符串拆分成【年月日】 与 【时分秒】:param start_time: 开始日期:param end_time: 结束日期:param fmt: 对应的日期格式:return: 返回拆分后的值"""data_dict = {'data': "", "warning_info": "", "error_info": "", }try:# 获取拆分后的时间格式if isinstance(start_time, str) and isinstance(end_time, str):start_date_str = start_time.split(" ")[0]start_time_str = start_time.split(" ")[-1]end_date_str = end_time.split(" ")[0]end_time_str = end_time.split(" ")[-1]elif isinstance(start_time, datetime) and isinstance(end_time, datetime):try:start_date_str = datetime.strftime(start_time, fmt).split(" ")[0]start_time_str = datetime.strftime(start_time, fmt).split(" ")[-1]end_date_str = datetime.strftime(end_time, fmt).split(" ")[0]end_time_str = datetime.strftime(end_time, fmt).split(" ")[-1]except ValueError:data_dict["error_info"] = "日期类型格式转换失败"return data_dictelse:data_dict["error_info"] = "数据类型不一致"return data_dictdata_dict["data"] = start_date_str, start_time_str, end_date_str, end_time_strexcept Exception as e:USE_LOGGER.exception(e)finally:return data_dict# 拆分日 日期
def split_day_time(start_time, end_time, whole_fmt='%Y-%m-%d %H:%M:%S', date_fmt='%Y-%m-%d', split_day=1):"""按照指定拆分的日间隔,拆分为列表:param start_time: 开始日期:param end_time: 结束日期:param whole_fmt: 对应的整个日期格式:param date_fmt: 对应日的日期格式:param split_day: 拆分的间隔:return: 返回嵌套列表,每一个子列表为固定时间间隔的值"""data_dict = {'data': "", "warning_info": "", "error_info": "", }ever_date_list = []handle_result_dict = handle_date_and_time(start_time, end_time, fmt=whole_fmt)if handle_result_dict["error_info"]: returnstart_date_str, start_time_str, end_date_str, end_time_str = handle_result_dict["data"]if start_date_str == start_time_str or end_date_str == end_time_str:start_time_str = ""end_time_str = ""try:ever_date = datetime.strptime(start_date_str, date_fmt).date()end_date = datetime.strptime(end_date_str, date_fmt).date()if ever_date == end_date:ever_date_list.append([f"{ever_date} {start_time_str}" if start_time_str else f"{ever_date}",f"{ever_date} {end_time_str}" if end_time_str else f"{ever_date}"])else:while ever_date < end_date:new_start_date = f"{ever_date} {start_time_str}" if start_time_str else f"{ever_date}"ever_date += timedelta(days=split_day)ever_date = ever_datenew_end_date = f"{ever_date} {end_time_str}" if end_time_str else f"{ever_date}"ever_date_list.append([new_start_date, new_end_date])data_dict["data"] = ever_date_listexcept ValueError:data_dict["error_info"] = "日期类型格式转换失败"return data_dictfinally:return data_dict# 获取每一天时间列表
def get_day_date_list(start_time, end_time, whole_fmt='%Y-%m-%d', date_fmt='%Y-%m-%d', out_fmt='%Y-%m-%d'):data_dict = {'data': "", "warning_info": "", "error_info": "", }day_date_list = []handle_result_dict = handle_date_and_time(start_time, end_time, fmt=whole_fmt)if handle_result_dict["error_info"]: returntry:start_date_str, start_time_str, end_date_str, end_time_str = handle_result_dict["data"]start_date = datetime.strptime(start_date_str, date_fmt).date()end_date = datetime.strptime(end_date_str, date_fmt).date()delta = end_date - start_date# 生成每一天的日期并添加到列表中for i in range(delta.days + 1):date = start_date + timedelta(days=i)day_date_list.append(date.strftime(out_fmt))data_dict["data"] = day_date_listexcept ValueError:data_dict["error_info"] = "日期类型格式转换失败"return data_dictfinally:return data_dictif __name__ == '__main__':# s_time = "2024-01-09 00:00:00"# e_time = "2024-01-12 00:00:00"# w_fmt = '%Y-%m-%d %H:%M:%S'# d_fmt = '%Y-%m-%d's_time = "2024-01-09"e_time = "2024-01-20"w_fmt = '%Y-%m-%d'd_fmt = '%Y-%m-%d'result = split_day_time(s_time, e_time, w_fmt, d_fmt)print(result)


http://www.ppmy.cn/news/1314032.html

相关文章

网络安全服务

有效防御Cc、API接口、http、tcp、WEB应用扫描/爬虫、SYN、WAF、DDOS、UDP、入侵、渗透、SQL注入、XXS跨站脚本攻击、远程恶意代码执行、session ion fixation、Webshell攻击、恶意请求&#xff0c;恶意扫描、暴击破解、CSRF等各种攻击。不用迁移数据&#xff0c;服务器用哪里…

【电脑技巧】Win11关闭自动更新

要想彻底关闭Windows电脑的自动更新&#xff0c;仅仅从系统设置里面选择暂停更新是完全不够用的&#xff0c;只有将windows自动更新的服务关闭掉&#xff0c;才能有效阻止其更新。 关闭win11电脑自动更新的办法&#xff0c;具体操作如下&#xff1a; 1.在winr运行框中输入servi…

区间合并(pair,auto的用法)

给定 n 个区间 [li,ri]&#xff0c;要求合并所有有交集的区间。 注意如果在端点处相交&#xff0c;也算有交集。 输出合并完成后的区间个数。 例如&#xff1a;[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。 输入格式 第一行包含整数 n。 接下来 n行&#xff0c;每行包含两…

linux安装MySQL5.7(安装、开机自启、定时备份)

一、安装步骤 我喜欢安装在/usr/local/mysql目录下 #切换目录 cd /usr/local/ #下载文件 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz #解压文件 tar -zxvf mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz -C /usr/local …

观测云产品更新 | 日志、场景仪表板、监控器等

观测云更新 用户访问监测 &#xff08;RUM &#xff09; 公网 Dataway 支持 ip 转换成地理位置信息。 日志 > 查看器详情页 1、新增 BPF 网络日志采集及日志详情页&#xff0c;支持 Json 格式转化&#xff1b; 2、上述 1 中的日志详情页中新增可读的展示模式&#xff0c…

项目管理认证 | PMP是什么证书?PMP含金量高吗?

自国内引入PMI的项目管理专业人士认证考试(PMP)以来&#xff0c;这项考试如今已经成为项目管理从业者对自身的要求&#xff0c;也成为即将从事项目管理工作的人员的“敲门砖”。 如果你对这项考试感兴趣的话&#xff0c;今天小编就给大家带来了相关介绍&#xff0c;一起来看下…

产品经理NPDP

产品经理是告诉团队做正确的事情&#xff0c;项目经理是告诉团队正确地做事情 产品经理的核心能力是商业洞察能力、产品规划与设计、团队管理能力。 产品经理国际资格认证(NPDP)

【test】wsl2和win互ping

参考&#xff1a; https://zhuanlan.zhihu.com/p/365058237 https://blog.csdn.net/Cypher_X/article/details/123011200