尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

python3 datetime模块

python3 datetime模块
📅 发布时间:2026/6/20 21:14:16

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. 时间戳转换

时间戳是「从 1970-01-01 00:00:00 UTC 到当前时间的秒数」,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. 生成指定范围内的日期列表

比如生成 2025 年 12 月的所有日期: 
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年无机纳米硅磨石厂家权威推荐榜单:现浇磨石‌/无机磨石‌/磨石施工‌‌源头厂家精选
  • 剑指offer-47、求1+2+3...+n
  • 2025年北京银行灵活贷款服务五大推荐机构排行榜,看哪家口碑

最新新闻

  • 合肥理工学校招生办电话号码是多少?2026年合肥理工学校最新权威发布! - 教育为先
  • 2026 AI 搜索 GEO 优化公司推荐:国内外 GEO 服务商选择与避坑指南 - GrowthUME
  • 2026中考美术联考冲刺机构选型参考:罗丹艺术培训学校行业适配性深度分析 - 云南美术头条
  • 2026年6月最新萧邦中国官方售后服务电话网点及客服中心地址 - 亨得利官方服务中心
  • 告别叛逆网瘾!2026 东营十大权威特训学校盘点,20 年经验 + 全封闭管理,帮孩子重回正轨 - 辛云教育资讯
  • 巧用自定义协议:将RTSP流无缝接入NVR并模拟GB28181通道

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号