python3 datetime模块
datetime模块的核心用法与避坑要点。
一、datetime 模块核心组件
datetime模块包含 5 个核心类,覆盖日期、时间、时间差、时区的全维度处理:| 类名 | 作用 | 示例 |
|---|---|---|
date |
处理年 / 月 / 日(无时间) | date(2025, 12, 9) |
time |
处理时 / 分 / 秒 / 微秒(无日期) | time(14, 30, 59) |
datetime |
整合日期 + 时间(最常用) | datetime(2025, 12, 9, 14, 30) |
timedelta |
表示时间差(天 / 小时 / 分钟等) | timedelta(days=7) |
zoneinfo |
处理时区(Python3.9 + 新增) | zoneinfo.ZoneInfo("Asia/Shanghai") |
二、基础用法:创建、格式化、解析
1. 获取当前时间
from datetime import date, time, datetime# 获取当前日期(仅年月日)
today = date.today()
print("当前日期:", today) # 输出:2025-12-09# 获取当前日期时间(含时分秒)
now = datetime.now()
print("当前日期时间:", now) # 输出:2025-12-09 14:35:20.123456# 获取当前UTC时间(世界协调时间)
utc_now = datetime.utcnow()
print("UTC时间:", utc_now) # 输出:2025-12-09 06:35:20.123456(东8区差8小时)
2. 手动构造时间对象
年、月、日、时、分、秒、微秒,且月份从 1 开始(区别于其他语言的 0 起始):from datetime import date, time, datetime# 构造日期对象(年、月、日为必填)
custom_date = date(2025, 12, 25)
print(custom_date) # 2025-12-25# 构造时间对象(时为必填,分/秒/微秒可选)
custom_time = time(18, 30, 0)
print(custom_time) # 18:30:00# 构造日期时间对象
custom_datetime = datetime(2025, 12, 25, 18, 30, 0)
print(custom_datetime) # 2025-12-25 18:30:00
3. 日期时间格式化(转字符串)
strftime()方法将时间对象转为指定格式的字符串,核心格式符如下:| 格式符 | 含义 | 示例 |
|---|---|---|
| %Y | 4 位年份 | 2025 |
| %y | 2 位年份 | 25 |
| %m | 2 位月份 | 12 |
| %d | 2 位日期 | 09 |
| %H | 24 小时制小时 | 14 |
| %I | 12 小时制小时 | 02 |
| %M | 分钟 | 35 |
| %S | 秒 | 20 |
| %A | 星期全称 | Tuesday |
| %a | 星期简称 | Tue |
from datetime import datetimenow = datetime.now()
# 格式化为「年-月-日 时:分:秒」
fmt1 = now.strftime("%Y-%m-%d %H:%M:%S")
print(fmt1) # 2025-12-09 14:35:20# 格式化为「月/日/年 星期 12小时制(带AM/PM)」
fmt2 = now.strftime("%m/%d/%y %A %I:%M %p")
print(fmt2) # 12/09/25 Tuesday 02:35 PM
4. 字符串解析为时间对象
strptime()方法将字符串转为datetime对象,格式符必须与字符串格式完全匹配:from datetime import datetime# 待解析的时间字符串
time_str = "2025-12-25 18:30:00"
# 解析为datetime对象(格式符需与字符串一致)
parsed_dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
print(parsed_dt) # 2025-12-25 18:30:00
print(type(parsed_dt)) # <class 'datetime.datetime'># 错误示例:格式符不匹配(比如用%y代替%Y)
# parsed_dt = datetime.strptime(time_str, "%y-%m-%d %H:%M:%S") # 报错ValueError
三、进阶操作:时间计算与比较
1. 时间差计算(timedelta)
timedelta用于表示时间间隔,支持与datetime对象做加减运算,常用参数:days(天)、hours(小时)、minutes(分钟)、seconds(秒)、weeks(周)。from datetime import datetime, timedeltanow = datetime.now()# 计算7天后的时间
after_7d = now + timedelta(days=7)
print("7天后:", after_7d) # 2025-12-16 14:35:20.123456# 计算3小时30分钟前的时间
before_3h30m = now - timedelta(hours=3, minutes=30)
print("3小时30分钟前:", before_3h30m) # 2025-12-09 11:05:20.123456# 计算两个时间的差值
dt1 = datetime(2025, 12, 25, 18, 30)
dt2 = datetime(2025, 12, 9, 14, 30)
delta = dt1 - dt2
print("时间差:", delta) # 16 days, 4:00:00
print("相差天数:", delta.days) # 16
print("相差秒数:", delta.total_seconds()) # 1382400.0
2. 日期时间比较
datetime/date对象支持直接用>、<、==、!=等运算符比较: from datetime import datetimedt1 = datetime(2025, 12, 9, 14, 30)
dt2 = datetime(2025, 12, 10, 10, 0)print(dt1 < dt2) # True
print(dt1 == dt2) # False
print(dt1 > dt2) # False# 判断是否为今天
today = datetime.now().date()
target_date = datetime(2025, 12, 9).date()
print(target_date == today) # True
3. 时间戳转换
datetime支持与时间戳互转:from datetime import datetime# 1. datetime转时间戳
now = datetime.now()
timestamp = now.timestamp()
print("当前时间戳:", timestamp) # 1733750120.123456# 2. 时间戳转datetime
dt_from_ts = datetime.fromtimestamp(timestamp)
print("时间戳转回datetime:", dt_from_ts) # 2025-12-09 14:35:20.123456# 3. UTC时间戳转datetime(避免时区偏差)
utc_dt_from_ts = datetime.utcfromtimestamp(timestamp)
print("UTC时间戳转换:", utc_dt_from_ts) # 2025-12-09 06:35:20.123456
四、实战场景:时区处理与批量生成日期
1. 时区处理(Python3.9+ zoneinfo)
datetime对象是「天真时间」(无时区),处理跨时区业务时需显式指定时区:from datetime import datetime
from zoneinfo import ZoneInfo# 1. 创建带时区的datetime对象(上海时区)
sh_dt = datetime.now(ZoneInfo("Asia/Shanghai"))
print("上海时间:", sh_dt) # 2025-12-09 14:35:20.123456+08:00# 2. 转换为纽约时区
ny_dt = sh_dt.astimezone(ZoneInfo("America/New_York"))
print("纽约时间:", ny_dt) # 2025-12-08 23:35:20.123456-05:00# 3. 列出所有可用时区
# import zoneinfo
# print(zoneinfo.available_timezones())
2. 生成指定范围内的日期列表
from datetime import date, timedeltastart_date = date(2025, 12, 1)
end_date = date(2025, 12, 31)date_list = []
current_date = start_date
while current_date <= end_date:date_list.append(current_date)current_date += timedelta(days=1)# 打印前5天
print("2025年12月前5天:", date_list[:5])
# 输出:[datetime.date(2025, 12, 1), ..., datetime.date(2025, 12, 5)]
五、避坑指南:常见错误与解决方案
1. 格式符混淆(% Y vs % y、% H vs % I)
%Y是 4 位年份,%y是 2 位年份,混用会导致解析失败:# 错误:用%y解析4位年份 # datetime.strptime("2025-12-09", "%y-%m-%d") # ValueError # 正确: datetime.strptime("2025-12-09", "%Y-%m-%d")%H是 24 小时制,%I是 12 小时制(需搭配 % p):# 错误:14点用%I解析(12小时制最大12) # datetime.strptime("14:30", "%I:%M") # ValueError # 正确: datetime.strptime("14:30", "%H:%M") datetime.strptime("02:30 PM", "%I:%M %p") # 12小时制+AM/PM
2. timedelta 不支持月份 / 年份加减
timedelta仅支持天 / 小时等固定间隔,无法直接加减月份(不同月份天数不同),需借助dateutil库:# 安装:pip install python-dateutil
from datetime import datetime
from dateutil.relativedelta import relativedeltanow = datetime.now()
# 加1个月
next_month = now + relativedelta(months=1)
print("下个月今天:", next_month) # 2026-01-09 14:35:20.123456# 减2年
last_2y = now - relativedelta(years=2)
print("2年前今天:", last_2y) # 2023-12-09 14:35:20.123456
3. 时间对象不可变
datetime/date对象创建后无法修改属性,需重新创建:from datetime import datetimedt = datetime(2025, 12, 9)
# 错误:直接修改属性
# dt.month = 11 # AttributeError
# 正确:重新创建
dt_new = dt.replace(month=11)
print(dt_new) # 2025-11-09 00:00:00
相关新闻
2025年跨境电商服务商权威推荐榜单:东南亚跨境电商/海外电商/电商开店培训服务商精选
跨境电商的迅猛发展,催生了一个庞大而专业的服务商生态。据行业分析报告显示,超过70%的跨境电商卖家正在使用至少一种外部专业服务,以应对从流量获取、订单履约到客户运营的全链条挑战。在众多服务商中,能够提供 “…
2025年宁波厂房装修公司综合排名及解析,看哪家实力强
在宁波的商业发展进程中,厂房作为企业生产的核心场所,其装修质量直接关系到生产效率与安全生产;展台搭建是企业展示产品、拓展市场的重要窗口;寺庙修缮则肩负着传承历史文化的责任。面对市场上众多装修公司,如何选…
2025年度中国抖音外卖服务商TOP5推荐:斯创全域外卖的售
随着本地生活服务赛道竞争加剧,抖音外卖业务整合升级后,服务商的专业能力成为商家破局的关键。本榜单基于真实合作案例与行业口碑调研,筛选出五家标杆服务商,为商家匹配适配伙伴提供客观参考。 TOP1 推荐:杭州斯创…
最新新闻
工业报警器语音芯片选型实战:KT148A对比九齐NY3P,长语音与高性价比方案解析
1. 项目背景:从“九齐NY3P”到“KT148A”的选型转变最近在为一个工业报警器项目做语音播报方案选型,客户原本指定了台系的九齐NY3P系列语音芯片,要求是成本低、开发快、语音长度要足够。我们拿到需求后,第一反应也是去评估九齐的方…
CefFlashBrowser:终极Flash浏览器解决方案,让经典Flash游戏和应用重获新生
CefFlashBrowser:终极Flash浏览器解决方案,让经典Flash游戏和应用重获新生 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 随着Adobe Flash Player的正式退役&…
小牛电动车电池无输出故障诊断与维修全攻略
1. 项目概述:当你的小牛“心脏”骤停作为一名捣鼓过各种两轮电驴的老玩家,我最近帮朋友处理了一台“趴窝”的小牛电动自行车,症状很典型:仪表盘能亮,车灯能闪,但一拧转把,车子纹丝不动ÿ…
功率放大电路全解析:从A类到D类,原理、选型与实战指南
1. 功率放大电路:从“听个响”到“极致效率”的演进之路聊到音响、对讲机、电台甚至是手机信号塔,背后都离不开一个核心的电子模块——功率放大电路。它的任务很简单,就是把一个微弱的信号,比如从手机音频芯片出来的几毫伏电压&am…
Android Hook机制实战:从原理到面试,掌握系统级编程核心
1. 项目概述:为什么Hook是Android面试的“硬通货”?又到年底了,最近帮团队面试了不少Android方向的候选人,发现一个挺有意思的现象:几乎每个人简历上都写着“熟悉Android Framework”、“了解插件化/热修复原理”&…
2026五金模架源头供应商:广东正德模胚钢材有限公司专业分析 - 优企名品
2026五金模架源头供应商:广东正德模胚钢材有限公司专业分析 本篇将回答的核心问题在五金模架行业,如何评估一家模架供应商的技术实力与交付能力? 广东正德模胚钢材有限公司在标准与非标模架领域,具体具备哪些竞争优…
日新闻
ffmpeg-static 跨平台多媒体处理架构解析与技术实践
ffmpeg-static 跨平台多媒体处理架构解析与技术实践 【免费下载链接】ffmpeg-static ffmpeg static binaries for Mac OSX and Linux and Windows 项目地址: https://gitcode.com/gh_mirrors/ff/ffmpeg-static ffmpeg-static 项目为 macOS、Linux 和 Windows 三大主流操…
7步掌握KMS智能激活工具:Windows和Office永久激活完整方案
7步掌握KMS智能激活工具:Windows和Office永久激活完整方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO KMS_VL_ALL_AIO是一款功能强大的智能激活脚本工具,专为Windows…
Linux 二进制分析利器:strings 命令从入门到实战全解
一、命令简介strings 命令用于在二进制文件、可执行文件、对象文件或任何数据文件中查找并提取可打印的字符串序列。它默认识别长度至少为 4 个字符的可打印 ASCII 字符串(以换行符或空字符终止)。该工具在逆向工程、调试和二进制文件分析中非常有用&…
周新闻
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集
Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…
智慧飞行 大疆无人机一站式智能管控平台/支持大疆机场/私有化部署 从航线规划、自动飞行、AI识别到数据管理,一个平台全搞定
智慧飞行-大疆无人机一站式智能管控平台/支持大疆机场/私有化部署 企业级全域智能无人机一体化管控平台源码! 专为电力巡检、安防监控、应急救援、测绘勘察等行业打造,让您的无人机舰队实现 “无人化、自动化、智能化” 管理! 🎯 …
揭秘ChatGPT+Mathematica协同教学:为什么92%的初学者在72小时内建立函数直觉?
更多请点击: https://codechina.net 第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
月新闻
[C++]内存管理:串顺序存储的内存回收
在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比
移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建
本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…