Python时间处理必学技能:datetime模块功能拆解+代码逐行解析
datetime
模块是 Python 中处理日期和时间的核心模块。本文从功能分类角度详细解析其所有核心功能,并为每个核心函数提供完整代码示例。
datetime
模块分类
- 日期处理(
date
类)- 基础操作
- 日期计算与属性
- 时间处理(
time
类) - 日期时间组合(
datetime
类) - 时间间隔计算(
timedelta
类) - 时区处理(
tzinfo
与第三方库) - 格式化与解析(
strftime
和strptime
) - 实用工具与进阶技巧
一、日期处理(date
类)
1. 基础操作
date.today()
:获取当前日期
from datetime import date
today = date.today()
print("当前日期:", today) # 输出: 2025-03-10
date.fromisoformat()
:从字符串解析日期
d = date.fromisoformat("2025-01-05")
print("解析日期:", d) # 输出: 2025-01-05
date.fromordinal()
:从公历序数创建日期
d = date.fromordinal(739320) # 公历序数(从1年1月1日起)
print("序数对应日期:", d) # 输出: 2025-03-10
2. 日期计算与属性
date.replace()
:修改日期部分值
new_date = today.replace(year=2024, month=12)
print("修改后的日期:", new_date) # 输出: 2024-12-10
date.weekday()
和 date.isoweekday()
:获取星期
print("星期(0=周一):", today.weekday()) # 输出: 3(星期四)
print("星期(1=周一):", today.isoweekday()) # 输出: 4(星期四)
date.ctime()
:生成可读字符串
print("可读格式:", today.ctime()) # 输出: Mon Mar 10 00:00:00 2025
date.toordinal()
:转换为公历序数
print("公历序数:", today.toordinal()) # 输出: 739320
二、时间处理(time
类)
核心功能
time.replace()
:修改时间部分值
from datetime import time
t = time(14, 30, 15)
new_time = t.replace(hour=9, minute=0)
print("修改后的时间:", new_time) # 输出: 09:00:15
time.isoformat()
:生成 ISO 8601 字符串
print("ISO格式:", t.isoformat()) # 输出: 14:30:15
time.strftime()
:自定义格式化
print("12小时制格式:", t.strftime("%I:%M %p")) # 输出: 02:30 PM
三、日期时间组合(datetime
类)
1. 基础操作
datetime.now()
和 datetime.utcnow()
from datetime import datetime
local_now = datetime.now()
utc_now = datetime.utcnow()
print("本地时间:", local_now) # 输出: 2025-03-10 07:33:18.120428
print("UTC时间:", utc_now) # 输出: 2025-03-09 23:33:18.125247
datetime.combine()
:合并日期和时间
d = date(2025, 3, 5)
t = time(14, 30)
dt = datetime.combine(d, t)
print("合并结果:", dt) # 输出: 2025-03-05 14:30:00
2. 时间戳与属性
datetime.timestamp()
:转换为 Unix 时间戳
timestamp = dt.timestamp()
print("时间戳:", timestamp) # 输出: 1741156200.0
datetime.date()
和 datetime.time()
:提取日期/时间
print("日期部分:", dt.date()) # 输出: 2025-03-05
print("时间部分:", dt.time()) # 输出: 14:30:00
四、时间间隔计算(timedelta
类)
核心功能
创建时间间隔
from datetime import timedelta
delta1 = timedelta(days=7, hours=3)
delta2 = timedelta(weeks=2, minutes=30)
print("间隔1:", delta1) # 输出: 7 days, 3:00:00
print("间隔2:", delta2) # 输出: 14 days, 0:30:00
timedelta.total_seconds()
:总秒数计算
print("总秒数:", delta1.total_seconds()) # 输出: 615600.0
五、时区处理(tzinfo
与第三方库)
1. 使用 pytz
库
创建时区感知对象
import pytz
from datetime import datetime
tz_shanghai = pytz.timezone("Asia/Shanghai")
dt_local = datetime.now(tz_shanghai)
print("上海时间:", dt_local) # 输出: 2025-03-10 07:40:43.495126+08:00
时区转换
dt_utc = dt_local.astimezone(pytz.utc)
print("UTC时间:", dt_utc) # 输出: 2025-03-09 23:40:43.495126+00:00
处理夏令时
tz_ny = pytz.timezone("America/New_York")
dt_ny = tz_ny.localize(datetime(2025, 3, 12, 2, 30), is_dst=False)
print("纽约夏令时:", dt_ny) # 输出: 2025-03-12 02:30:00-04:00
六、格式化与解析(strftime
和 strptime
)
1. 格式化符号大全
符号 | 说明 | 示例 |
---|---|---|
%j | 年内的第几天(001-366) | 278 |
%U | 年内的周数(周日为一周起点) | 40 |
%Z | 时区名称 | UTC |
%c | 本地日期时间表示 | Thu Oct 5 14:30:15 2025 |
2. 复杂格式示例
带时区的格式化
dt = datetime.now(pytz.utc)
print(dt.strftime("%Y-%m-%d %H:%M:%S %Z")) # 输出: 2025-03-09 23:44:24 UTC
解析含时区的字符串
dt_str = "2025-03-05 14:30:15+08:00"
dt = datetime.fromisoformat(dt_str)
print("解析结果:", dt) # 输出: 2025-03-05 14:30:15+08:00
七、实用工具与进阶技巧
1. 计算月末日期
import calendar
from datetime import date
def last_day_of_month(year, month):
_, last_day = calendar.monthrange(year, month)
return date(year, month, last_day)
print("2023-02月末:", last_day_of_month(2025, 2)) # 输出: 2025-02-28
2. 生成时间范围(精确到小时)
from datetime import datetime, timedelta
start = datetime(2025, 3, 10, 9, 0)
time_range = [start + timedelta(hours=i) for i in range(8)]
print("时间范围:", [t.strftime("%H:%M") for t in time_range])
# 输出: ['09:00', '10:00', ..., '16:00']
3. 处理闰秒(需手动调整)
from datetime import datetime
# 闰秒记录(2016-12-31 23:59:60)
leap_second = datetime(2016, 12, 31, 23, 59, 60)
print("闰秒时间(需手动处理):", leap_second) # 注意:实际代码中会抛出 ValueError
总结
本文覆盖了 datetime
模块所有核心功能,每个函数均配有可运行的代码示例。通过掌握以下关键点,可以应对 95% 的日期时间处理需求:
- 明确对象类型:区分
date
、time
、datetime
和时区感知对象。 - 时区敏感操作:始终使用
pytz
或zoneinfo
处理时区。 - 格式与解析:熟练使用
strftime
和strptime
的格式符号。 - 边界条件处理:闰年、月末、夏令时等场景需额外验证。