第93集:datetime模块详解
学习目标
- 理解datetime模块的作用和重要性
- 掌握datetime模块的核心类和对象
- 学会使用datetime模块处理日期和时间
- 了解datetime模块在实际开发中的应用场景
课程内容
1. datetime模块简介
datetime模块是Python标准库中用于处理日期和时间的模块,提供了丰富的日期时间操作功能。它包含多个类,用于表示日期、时间、日期时间、时间间隔等。
主要类:
- date:表示日期(年、月、日)
- time:表示时间(时、分、秒、微秒)
- datetime:表示日期和时间
- timedelta:表示时间间隔
- tzinfo:表示时区信息
2. date类 - 日期处理
2.1 创建date对象
示例:
from datetime import date
# 获取当前日期
today = date.today()
print(f"今天: {today}")
# 创建指定日期
d = date(2024, 1, 1)
print(f"指定日期: {d}")
# 从时间戳创建
d2 = date.fromtimestamp(1609459200)
print(f"从时间戳创建: {d2}")2.2 date对象属性
示例:
from datetime import date
d = date(2024, 1, 1)
print(f"年份: {d.year}")
print(f"月份: {d.month}")
print(f"日期: {d.day}")2.3 date对象方法
常用方法:
- today():获取当前日期
- weekday():返回星期几(0-6,0表示周一)
- isoweekday():返回ISO星期几(1-7,1表示周一)
- strftime():格式化日期
- replace():替换日期部分
示例:
from datetime import date
d = date(2024, 1, 1)
print(f"星期几(weekday): {d.weekday()}")
print(f"星期几(isoweekday): {d.isoweekday()}")
# 格式化日期
print(f"格式化: {d.strftime('%Y-%m-%d')}")
print(f"中文格式: {d.strftime('%Y年%m月%d日')}")
# 替换日期
d2 = d.replace(year=2025)
print(f"替换年份: {d2}")3. time类 - 时间处理
3.1 创建time对象
示例:
from datetime import time
# 创建时间对象
t = time(14, 30, 45)
print(f"时间: {t}")
# 创建时间对象(带微秒)
t2 = time(14, 30, 45, 123456)
print(f"带微秒的时间: {t2}")
# 创建时间对象(部分参数)
t3 = time(14, 30)
print(f"部分参数: {t3}")3.2 time对象属性
示例:
from datetime import time
t = time(14, 30, 45, 123456)
print(f"小时: {t.hour}")
print(f"分钟: {t.minute}")
print(f"秒: {t.second}")
print(f"微秒: {t.microsecond}")3.3 time对象方法
常用方法:
- strftime():格式化时间
- replace():替换时间部分
示例:
from datetime import time
t = time(14, 30, 45)
# 格式化时间
print(f"格式化: {t.strftime('%H:%M:%S')}")
print(f"12小时制: {t.strftime('%I:%M:%S %p')}")
# 替换时间
t2 = t.replace(hour=15)
print(f"替换小时: {t2}")4. datetime类 - 日期时间处理
4.1 创建datetime对象
示例:
from datetime import datetime
# 获取当前日期时间
now = datetime.now()
print(f"现在: {now}")
# 创建指定日期时间
dt = datetime(2024, 1, 1, 14, 30, 45)
print(f"指定日期时间: {dt}")
# 从时间戳创建
dt2 = datetime.fromtimestamp(1609459200)
print(f"从时间戳创建: {dt2}")
# 从字符串创建
dt3 = datetime.strptime('2024-01-01 14:30:45', '%Y-%m-%d %H:%M:%S')
print(f"从字符串创建: {dt3}")4.2 datetime对象属性
示例:
from datetime import datetime
dt = datetime(2024, 1, 1, 14, 30, 45, 123456)
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}")4.3 datetime对象方法
常用方法:
- now():获取当前日期时间
- today():获取当前日期时间
- strftime():格式化日期时间
- strptime():从字符串解析日期时间
- date():获取date对象
- time():获取time对象
- timestamp():获取时间戳
示例:
from datetime import datetime
dt = datetime(2024, 1, 1, 14, 30, 45)
# 获取date和time对象
print(f"日期部分: {dt.date()}")
print(f"时间部分: {dt.time()}")
# 获取时间戳
print(f"时间戳: {dt.timestamp()}")
# 格式化日期时间
print(f"格式化: {dt.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"中文格式: {dt.strftime('%Y年%m月%d日 %H时%M分%S秒')}")
# 替换日期时间
dt2 = dt.replace(year=2025, hour=15)
print(f"替换后: {dt2}")5. timedelta类 - 时间间隔
5.1 创建timedelta对象
示例:
from datetime import timedelta
# 创建时间间隔
td = timedelta(days=7, hours=12, minutes=30)
print(f"时间间隔: {td}")
# 创建时间间隔(秒)
td2 = timedelta(seconds=3600)
print(f"1小时: {td2}")
# 创建时间间隔(周)
td3 = timedelta(weeks=2)
print(f"2周: {td3}")5.2 timedelta对象属性
示例:
from datetime import timedelta
td = timedelta(days=7, hours=12, minutes=30, seconds=45)
print(f"天数: {td.days}")
print(f"秒数: {td.seconds}")
print(f"总秒数: {td.total_seconds()}")5.3 timedelta运算
示例:
from datetime import datetime, timedelta
now = datetime.now()
# 加上时间间隔
future = now + timedelta(days=7)
print(f"7天后: {future}")
# 减去时间间隔
past = now - timedelta(days=7)
print(f"7天前: {past}")
# 计算时间差
dt1 = datetime(2024, 1, 1)
dt2 = datetime(2024, 1, 10)
diff = dt2 - dt1
print(f"时间差: {diff}")
print(f"天数: {diff.days}")6. 日期时间格式化
6.1 strftime() - 格式化输出
常用格式化符号:
- %Y:四位年份
- %m:月份(01-12)
- %d:日期(01-31)
- %H:小时(00-23)
- %M:分钟(00-59)
- %S:秒(00-59)
- %f:微秒
- %A:星期名称
- %a:星期缩写
- %B:月份名称
- %b:月份缩写
- %p:AM/PM
示例:
from datetime import datetime
dt = datetime(2024, 1, 1, 14, 30, 45)
# 常用格式
print(f"标准格式: {dt.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"斜杠格式: {dt.strftime('%Y/%m/%d %H:%M:%S')}")
print(f"中文格式: {dt.strftime('%Y年%m月%d日 %H时%M分%S秒')}")
print(f"12小时制: {dt.strftime('%Y-%m-%d %I:%M:%S %p')}")
print(f"完整格式: {dt.strftime('%Y-%m-%d %H:%M:%S.%f')}")
print(f"星期格式: {dt.strftime('%Y-%m-%d %A')}")6.2 strptime() - 字符串解析
示例:
from datetime import datetime
# 解析不同格式的字符串
dt1 = datetime.strptime('2024-01-01 14:30:45', '%Y-%m-%d %H:%M:%S')
print(f"标准格式: {dt1}")
dt2 = datetime.strptime('2024/01/01 14:30:45', '%Y/%m/%d %H:%M:%S')
print(f"斜杠格式: {dt2}")
dt3 = datetime.strptime('2024年01月01日 14时30分45秒', '%Y年%m月%d日 %H时%M分%S秒')
print(f"中文格式: {dt3}")
dt4 = datetime.strptime('Jan 1, 2024 2:30 PM', '%b %d, %Y %I:%M %p')
print(f"英文格式: {dt4}")7. 时区处理
7.1 时区信息
示例:
from datetime import datetime, timezone, timedelta
# 创建时区
tz = timezone(timedelta(hours=8))
print(f"时区: {tz}")
# 创建带时区的datetime
dt = datetime(2024, 1, 1, 14, 30, 45, tzinfo=tz)
print(f"带时区的datetime: {dt}")
# 获取UTC时间
utc_dt = datetime.now(timezone.utc)
print(f"UTC时间: {utc_dt}")7.2 时区转换
示例:
from datetime import datetime, timezone, timedelta
# 创建UTC时间
utc_dt = datetime(2024, 1, 1, 6, 30, 45, tzinfo=timezone.utc)
print(f"UTC时间: {utc_dt}")
# 转换为东八区时间
tz = timezone(timedelta(hours=8))
local_dt = utc_dt.astimezone(tz)
print(f"东八区时间: {local_dt}")8. 实际应用场景
8.1 计算日期差
示例:
from datetime import datetime
def days_between(date1, date2):
dt1 = datetime.strptime(date1, '%Y-%m-%d')
dt2 = datetime.strptime(date2, '%Y-%m-%d')
diff = dt2 - dt1
return abs(diff.days)
# 计算两个日期之间的天数
days = days_between('2024-01-01', '2024-12-31')
print(f"天数: {days}")8.2 生成日期序列
示例:
from datetime import datetime, timedelta
def date_range(start_date, end_date):
start = datetime.strptime(start_date, '%Y-%m-%d')
end = datetime.strptime(end_date, '%Y-%m-%d')
dates = []
current = start
while current <= end:
dates.append(current.strftime('%Y-%m-%d'))
current += timedelta(days=1)
return dates
# 生成日期序列
dates = date_range('2024-01-01', '2024-01-10')
print(f"日期序列: {dates}")8.3 计算年龄
示例:
from datetime import date
def calculate_age(birth_date):
today = date.today()
birth = datetime.strptime(birth_date, '%Y-%m-%d').date()
age = today.year - birth.year
if (today.month, today.day) < (birth.month, birth.day):
age -= 1
return age
# 计算年龄
age = calculate_age('1990-01-01')
print(f"年龄: {age}岁")8.4 判断工作日
示例:
from datetime import datetime
def is_weekday(date_str):
dt = datetime.strptime(date_str, '%Y-%m-%d')
return dt.weekday() < 5
# 判断是否为工作日
print(f"2024-01-01是工作日: {is_weekday('2024-01-01')}")
print(f"2024-01-08是工作日: {is_weekday('2024-01-08')}")8.5 计算截止日期
示例:
from datetime import datetime, timedelta
def deadline(start_date, days):
start = datetime.strptime(start_date, '%Y-%m-%d')
end = start + timedelta(days=days)
return end.strftime('%Y-%m-%d')
# 计算截止日期
end_date = deadline('2024-01-01', 30)
print(f"截止日期: {end_date}")9. 最佳实践
使用datetime模块处理日期时间
- 避免使用字符串处理日期
- 使用datetime对象进行计算
- 使用strftime和strptime进行格式化
处理时区
- 明确时区信息
- 使用UTC作为标准
- 注意时区转换
处理异常
- 捕获日期解析异常
- 验证日期范围
- 处理闰年和闰秒
性能考虑
- 避免频繁创建datetime对象
- 使用timedelta进行计算
- 缓存常用日期
国际化
- 考虑不同地区的日期格式
- 使用本地化显示
- 处理不同时区
10. 常见问题
Q1: datetime和time模块有什么区别?
- datetime模块提供高级日期时间操作
- time模块提供低级时间操作
- datetime模块更适合业务逻辑
Q2: 如何处理时区?
- 使用timezone类创建时区
- 使用pytz库处理复杂时区
- 使用UTC作为标准时间
Q3: 如何计算两个日期之间的工作日?
- 使用weekday()判断工作日
- 遍历日期范围
- 排除周末和节假日
Q4: 如何处理闰年?
- datetime模块自动处理闰年
- 使用calendar模块判断闰年
- 注意2月的天数
总结
datetime模块是Python中处理日期和时间的核心模块,提供了丰富的日期时间操作功能。掌握datetime模块可以帮助我们:
- 处理日期和时间数据
- 进行日期时间计算
- 格式化和解析日期时间
- 处理时区问题
- 实现各种日期时间相关的功能
在实际开发中,datetime模块广泛应用于日志记录、数据分析、任务调度、报表生成等领域。
练习
- 编写一个函数,计算两个日期之间的天数
- 创建一个日期序列生成器,支持按天、周、月生成
- 实现一个年龄计算器,支持精确到天
- 编写一个工作日计算器,排除周末和节假日
- 创建一个时区转换工具,支持多个时区
下节预告
下一集将学习time模块,了解如何处理时间戳、延迟执行、性能测量等操作。