lesson13:Python的datetime模块
目录
一、模块核心组件
1. date类:处理日期(年/月/日)
2. time类:处理时间(时/分/秒/微秒)
3. datetime类:日期时间组合(最常用)
4. timedelta类:时间间隔计算
二、格式化日期时间
三、时区处理进阶
使用zoneinfo(Python 3.9+标准库)
时区数据库
四、实际应用场景
1. 计算程序运行时间
2. 生成时间序列数据
3. 日志时间格式化
五、常见问题与解决方案
1. 日期比较大小
2. 处理闰年/闰月
3. 性能优化
总结
一、模块核心组件
datetime模块主要包含以下四个核心类,覆盖了日期时间处理的几乎所有场景:
1. date类:处理日期(年/月/日)
- 创建方式:
date(year, month, day)
,需注意参数合法性(如月份1-12,日期不超过当月天数) - 常用属性:
.year
.month
.day
- 实用方法:
today()
:获取当前本地日期fromtimestamp(timestamp)
:从时间戳创建日期对象weekday()
:返回星期几(0=周一,6=周日)isoweekday()
:返回ISO标准星期几(1=周一,7=周日)
from datetime import date
today = date.today()
print(today) # 输出:2025-07-14
print(today.strftime("%Y年%m月%d日 星期%w")) # 格式化输出
2. time类:处理时间(时/分/秒/微秒)
- 创建方式:
time(hour=0, minute=0, second=0, microsecond=0)
- 注意事项:时间对象不包含日期信息,也不处理时区
- 常用方法:
strftime()
格式化时间字符串
3. datetime类:日期时间组合(最常用)
- 创建方式:
datetime(year, month, day, hour=0, minute=0, ...)
- 核心方法:
now()
:获取当前本地日期时间utcnow()
:获取当前UTC日期时间strptime(date_string, format)
:从字符串解析为datetime对象timestamp()
:转换为Unix时间戳(秒级浮点数)
from datetime import datetime
dt = datetime.now()
print(dt.strftime("%Y-%m-%d %H:%M:%S.%f")) # 带微秒的完整时间
# 字符串转datetime
dt_str = "2025-01-01 12:30:45"
dt = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S")
4. timedelta类:时间间隔计算
- 作用:表示两个日期/时间之间的差值
- 创建方式:
timedelta(days=0, seconds=0, microseconds=0, hours=0, minutes=0, weeks=0)
- 常用操作:支持与datetime对象的加减运算
from datetime import timedelta
# 计算3天后的日期
future = datetime.now() + timedelta(days=3)
# 计算两个日期差
delta = future - datetime.now()
print(delta.days, delta.total_seconds()) # 天数和总秒数
二、格式化日期时间
strftime()方法和strptime()方法是处理日期时间字符串的核心,需要熟练掌握格式化指令:
指令 | 含义 | 示例 |
---|---|---|
%Y | 4位年份 | 2025 |
%m | 2位月份(01-12) | 07 |
%d | 2位日期(01-31) | 14 |
%H | 24小时制小时(00-23) | 15 |
%M | 分钟(00-59) | 45 |
%S | 秒(00-59) | 30 |
%f | 微秒(000000-999999) | 123456 |
%a | 星期缩写 | Mon |
%A | 星期全称 | Monday |
%b | 月份缩写 | Jul |
%B | 月份全称 | July |
实用示例:
# 生成带星期的日期字符串
dt = datetime.now()
print(dt.strftime("%Y年%m月%d日 %A %H:%M")) # 2025年07月14日 Monday 15:45
三、时区处理进阶
datetime模块原生不支持时区,但可通过pytz
库或Python 3.9+的zoneinfo
模块扩展:
使用zoneinfo(Python 3.9+标准库)
from datetime import datetime
from zoneinfo import ZoneInfo # 注意区分大小写# 创建带时区的datetime对象
ny_time = datetime.now(ZoneInfo("America/New_York"))
bj_time = datetime.now(ZoneInfo("Asia/Shanghai"))# 时区转换
dt_utc = datetime.utcnow().replace(tzinfo=ZoneInfo("UTC"))
dt_bj = dt_utc.astimezone(ZoneInfo("Asia/Shanghai"))
时区数据库
- 可用时区列表可通过
zoneinfo.available_timezones()
查看 - 常用时区:
Asia/Shanghai
(北京时间)、UTC
(协调世界时)、America/New_York
(纽约时间)
四、实际应用场景
1. 计算程序运行时间
import time
from datetime import datetimestart = datetime.now()
# 执行耗时操作
time.sleep(2)
end = datetime.now()
print(f"程序运行时间:{(end - start).total_seconds():.2f}秒")
2. 生成时间序列数据
def generate_date_range(start_date, end_date):
"""生成日期范围内的所有日期"""
delta = timedelta(days=1)
current = start_date
while current <= end_date:
yield current
current += delta# 使用示例
start = date(2025, 1, 1)
end = date(2025, 1, 10)
for dt in generate_date_range(start, end):
print(dt)
3. 日志时间格式化
def log(message):
"""带时间戳的日志函数"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] {message}")log("系统启动成功") # [2025-07-14 15:45:30] 系统启动成功
五、常见问题与解决方案
1. 日期比较大小
直接使用比较运算符(<, >, ==)即可,datetime对象支持自然排序
2. 处理闰年/闰月
date类会自动处理月份天数,无需手动判断:
# 2024是闰年,2月有29天
leap_day = date(2024, 2, 29)
next_year = leap_day.replace(year=2025) # 自动调整为2025-03-01
3. 性能优化
- 大量日期处理时,优先使用
datetime
而非time
模块 - 解析固定格式字符串时,
datetime.strptime()
比正则表达式更高效
总结
datetime模块提供了Python日期时间处理的完整解决方案,掌握它能让你轻松应对各类时间相关任务。建议进一步学习:
- 进阶库:
dateutil
(提供更强大的相对时间计算和解析)、pendulum
(更友好的时区处理) - 应用场景:定时任务调度(结合
schedule
库)、数据分析中的时间序列处理(结合pandas
) - 最佳实践:存储时间时优先使用UTC时间,展示时再转换为本地时区
通过灵活运用datetime模块,你可以在日志记录、数据统计、定时任务等场景中写出更专业、更健壮的代码。