![]()
02. 初识 datetime 模块
概述
datetime是 Python 处理日期和时间的核心模块,提供了date、time、datetime、timedelta、tzinfo五个主要类。掌握这个模块是时间处理的基础。
| 维度 | 内容 |
|---|
| What | datetime 模块的五大核心类及其基本用法 |
| Why | 日常日期时间操作的首选模块 |
| When | 需要处理日期、时间、时间差、时区时 |
| Where | import datetime或from datetime import date, time, datetime |
| Who | 所有 Python 开发者 |
| How | 根据需求选择合适的类和方法 |
1. datetime 模块五大类概览
┌─────────────────────────────────────────────────────────────────┐ │ datetime 模块五大类 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ date - 处理日期(年、月、日) │ │ time - 处理时间(时、分、秒、微秒) │ │ datetime - 处理日期 + 时间(date + time) │ │ timedelta - 处理时间差/持续时间 │ │ tzinfo - 时区信息基类(抽象类) │ │ timezone - 时区实现类(Python 3.2+,tzinfo 的子类) │ │ │ └─────────────────────────────────────────────────────────────────┘
1.1 五大类对比
| 类 | 最小单位 | 是否包含时区 | 常见用途 |
|---|
date | 日 | ❌ | 生日、节假日、日期范围 |
time | 微秒 | ✅(可选) | 时间点、闹钟 |
datetime | 微秒 | ✅(可选) | 时间戳、日志、订单时间 |
timedelta | 微秒 | ❌ | 时间差、倒计时 |
tzinfo | - | ✅ | 时区定义(基类) |
2. 导入方式
# 方式1:导入整个模块(推荐,避免命名冲突)importdatetime d=datetime.date(2026,4,19)now=datetime.datetime.now()# 方式2:直接导入需要的类fromdatetimeimportdate,time,datetime,timedelta,timezone d=date(2026,4,19)now=datetime.now()# 方式3:导入所有(不推荐)fromdatetimeimport*
3. date 类(日期)
3.1 创建 date 对象
fromdatetimeimportdate# 方式1:直接指定年月日d=date(2026,4,19)print(d)# 2026-04-19print(type(d))# <class 'datetime.date'># 方式2:获取当前日期today=date.today()print(today)# 2026-04-19# 方式3:从时间戳创建importtime timestamp=time.time()d=date.fromtimestamp(timestamp)print(d)# 2026-04-19# 方式4:从 ISO 格式字符串创建(Python 3.7+)d=date.fromisoformat("2026-04-19")print(d)# 2026-04-19
3.2 date 属性和方法
fromdatetimeimportdate d=date(2026,4,19)# 属性print(f"年:{d.year}")# 2026print(f"月:{d.month}")# 4print(f"日:{d.day}")# 19# 方法print(f"替换:{d.replace(month=5)}")# 2026-05-19print(f"时间元组:{d.timetuple()}")# struct_timeprint(f"序号:{d.toordinal()}")# 从公元1年1月1日的天数print(f"星期(0=周一):{d.weekday()}")# 6(周日)print(f"星期(1=周一):{d.isoweekday()}")# 7(周日)print(f"ISO格式:{d.isoformat()}")# 2026-04-19print(f"CTime格式:{d.ctime()}")# Sun Apr 19 00:00:00 2026print(f"格式化:{d.strftime('%Y年%m月%d日')}")# 2026年04月19日
3.3 星期对照表
| 方法 | 周一 | 周二 | 周三 | 周四 | 周五 | 周六 | 周日 |
|---|
weekday() | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
isoweekday() | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
4. time 类(时间)
4.1 创建 time 对象
fromdatetimeimporttime# 基本创建t=time(14,30,15,500000)# 时、分、秒、微秒print(t)# 14:30:15.500000# 最小参数t=time(14,30)# 14:30:00print(t)# 14:30:00# 从 ISO 格式字符串创建(Python 3.7+)t=time.fromisoformat("14:30:15.5")print(t)# 14:30:15.500000
4.2 time 属性和方法
fromdatetimeimporttime t=time(14,30,15,500000)# 属性print(f"时:{t.hour}")# 14print(f"分:{t.minute}")# 30print(f"秒:{t.second}")# 15print(f"微秒:{t.microsecond}")# 500000# 方法print(f"替换:{t.replace(hour=10)}")# 10:30:15.500000print(f"ISO格式:{t.isoformat()}")# 14:30:15.500000print(f"格式化:{t.strftime('%H点%M分')}")# 14点30分
4.3 time 的 tzinfo 参数
fromdatetimeimporttime,timezone# 创建带时区的时间utc_time=time(14,30,tzinfo=timezone.utc)print(utc_time)# 14:30:00+00:00print(utc_time.tzname())# UTC
5. datetime 类(日期 + 时间)
5.1 创建 datetime 对象
fromdatetimeimportdatetime,timezoneimporttime# 方式1:直接指定dt=datetime(2026,4,19,14,30,15,500000)print(dt)# 2026-04-19 14:30:15.500000# 方式2:获取当前时间now=datetime.now()# 本地时间print(now)# 2026-04-19 09:30:00.123456utc_now=datetime.now(timezone.utc)# UTC 时间print(utc_now)# 2026-04-19 01:30:00.123456+00:00# 方式3:从时间戳创建timestamp=time.time()dt=datetime.fromtimestamp(timestamp)print(dt)# 2026-04-19 09:30:00.123456# 方式4:组合 date 和 timed=date(2026,4,19)t=time(14,30,15)dt=datetime.combine(d,t)print(dt)# 2026-04-19 14:30:15# 方式5:从 ISO 格式字符串创建dt=datetime.fromisoformat("2026-04-19T14:30:15")print(dt)# 2026-04-19 14:30:15# 方式6:从字符串解析dt=datetime.strptime("2026-04-19 14:30:15","%Y-%m-%d %H:%M:%S")print(dt)# 2026-04-19 14:30:15
5.2 datetime 属性和方法
fromdatetimeimportdatetime dt=datetime(2026,4,19,14,30,15,500000)# 属性(包含 date 和 time 的所有属性)print(f"年:{dt.year}")print(f"月:{dt.month}")print(f"日:{dt.day}")print(f"时:{dt.hour}")print(f"分:{dt.minute}")print(f"秒:{dt.second}")print(f"微秒:{dt.microsecond}")# 方法print(f"日期部分:{dt.date()}")# 2026-04-19print(f"时间部分:{dt.time()}")# 14:30:15.500000print(f"时间部分(有时区):{dt.timetz()}")print(f"替换:{dt.replace(month=5)}")# 2026-05-19 14:30:15.500000print(f"星期(0=周一):{dt.weekday()}")print(f"星期(1=周一):{dt.isoweekday()}")print(f"ISO格式:{dt.isoformat()}")# 2026-04-19T14:30:15.500000print(f"时间戳:{dt.timestamp()}")print(f"CTime格式:{dt.ctime()}")# Sun Apr 19 14:30:15 2026
6. timedelta 类(时间差)
6.1 创建 timedelta 对象
fromdatetimeimporttimedelta# 可以使用的参数td=timedelta(days=1,seconds=3600,microseconds=500,milliseconds=100,minutes=30,hours=2,weeks=1)print(td)# 8 days, 3:30:00.000500# 常用创建方式day=timedelta(days=1)# 1 day, 0:00:00hour=timedelta(hours=1)# 1:00:00minute=timedelta(minutes=1)# 0:01:00second=timedelta(seconds=1)# 0:00:01week=timedelta(weeks=1)# 7 days, 0:00:00
6.2 timedelta 属性和方法
fromdatetimeimporttimedelta td=timedelta(days=5,hours=3,minutes=30,seconds=15)# 属性(归一化后的值)print(f"天数:{td.days}")# 5print(f"秒数部分:{td.seconds}")# 12615 (3*3600 + 30*60 + 15)print(f"微秒部分:{td.microseconds}")# 0# 方法print(f"总秒数:{td.total_seconds()}")# 5*86400 + 12615 = 444615.0
6.3 timedelta 运算
fromdatetimeimportdatetime,timedelta now=datetime.now()# 加法:未来时间tomorrow=now+timedelta(days=1)next_week=now+timedelta(weeks=1)next_hour=now+timedelta(hours=1)# 减法:过去时间yesterday=now-timedelta(days=1)last_week=now-timedelta(weeks=1)# 两个 timedelta 运算td1=timedelta(days=5,hours=3)td2=timedelta(days=2,hours=5)print(td1+td2)# 7 days, 8:00:00print(td1-td2)# 2 days, 22:00:00print(td1*2)# 10 days, 6:00:00print(td1/2)# 2 days, 13:30:00
7. timezone 类(时区)
fromdatetimeimportdatetime,timezone,timedelta# UTC 时区utc=timezone.utcprint(utc)# UTC# 自定义偏移时区beijing_tz=timezone(timedelta(hours=8))print(beijing_tz)# UTC+08:00# 创建带时区的 datetimenow_utc=datetime.now(timezone.utc)now_beijing=datetime.now(beijing_tz)print(f"UTC:{now_utc}")print(f"北京时间:{now_beijing}")
8. 综合示例
fromdatetimeimportdate,time,datetime,timedelta,timezoneprint("="*50)print("datetime 模块综合示例")print("="*50)# 1. 创建各种对象print("\n1. 创建对象")d=date(2026,4,19)t=time(14,30,15)dt=datetime(2026,4,19,14,30,15)td=timedelta(days=7)print(f"日期:{d}")print(f"时间:{t}")print(f"日期时间:{dt}")print(f"时间差:{td}")# 2. 获取当前时间print("\n2. 获取当前时间")print(f"当前日期:{date.today()}")print(f"当前日期时间:{datetime.now()}")print(f"UTC 时间:{datetime.now(timezone.utc)}")# 3. 时间运算print("\n3. 时间运算")now=datetime.now()week_later=now+timedelta(weeks=1)diff=week_later-nowprint(f"现在:{now}")print(f"一周后:{week_later}")print(f"时间差:{diff}")print(f"总秒数:{diff.total_seconds()}")# 4. 提取各部分print("\n4. 提取日期时间各部分")dt=datetime(2026,4,19,14,30,15)print(f"完整:{dt}")print(f"年:{dt.year}, 月:{dt.month}, 日:{dt.day}")print(f"时:{dt.hour}, 分:{dt.minute}, 秒:{dt.second}")print(f"星期:{dt.strftime('%A')}")# 5. 字符串解析print("\n5. 字符串解析与格式化")date_str="2026-04-19 14:30:15"dt_parsed=datetime.strptime(date_str,"%Y-%m-%d %H:%M:%S")print(f"解析:{dt_parsed}")print(f"格式化:{dt_parsed.strftime('%Y年%m月%d日 %H时%M分%S秒')}")
9. 常见问题
| 问题 | 解决方案 |
|---|
datetime(2026, 13, 1)报错 | 月份必须在 1-12 之间 |
datetime(2026, 4, 32)报错 | 天数必须在有效范围内 |
| naive 和 aware 比较报错 | 统一转换为同一类型 |
| 时区转换错误 | 使用astimezone()方法 |
10. 总结
| 类 | 核心用途 | 常用方法 |
|---|
date | 处理日期 | today(),weekday(),replace() |
time | 处理时间 | replace(),isoformat() |
datetime | 处理日期+时间 | now(),strptime(),strftime() |
timedelta | 处理时间差 | total_seconds() |
timezone | 处理时区 | utc常量 |