以下是 Python datetime
模块的详细解析,涵盖其核心功能、常用函数及使用场景:
1. 模块概述
datetime
是 Python 标准库的核心模块之一,用于处理日期和时间相关的操作,包括:
- 创建日期、时间、日期时间对象
- 时间计算(加减、间隔)
- 时区管理
- 日期时间格式化与解析
- 夏令时(DST)支持
注意:
- 纯 Python 实现,性能较低,高频时间计算建议使用
numpy
或pandas
。 - 时区支持需结合
pytz
或zoneinfo
(Python 3.2+ 自带)模块。
2. 核心类与常用函数
**(1) 核心类**
类名 | 描述 |
---|---|
datetime.date | 表示日期(年、月、日) |
datetime.time | 表示时间(时、分、秒、微秒) |
datetime.datetime | 表示日期和时间(包含微秒) |
datetime.timedelta | 表示时间间隔(天数、秒、微秒等) |
datetime.timezone | 表示时区信息(Python 3.2+) |
**(2) 创建日期时间对象**
函数/方法 | 描述 | 示例 |
---|---|---|
datetime.now() | 获取当前系统时间(含时区) | now = datetime.now() → 2024-03-10 14:20:30.123456+08:00 |
datetime.today() | 获取当前日期(本地时间,无时区) | today = datetime.today() → 2024-03-10 |
datetime.fromtimestamp(timestamp) | 通过 Unix 时间戳创建时间对象 | timestamp = 1678464000; dt = datetime.fromtimestamp(timestamp) → 2023-03-10 08:00:00+00:00 |
datetime.date(year, month, day) | 构造日期对象 | date(2024, 3, 10) → 2024-03-10 |
**(3) 时间计算与操作**
方法/属性 | 描述 | 示例 |
---|---|---|
datetime.timedelta(days=1) | 创建时间间隔(如 timedelta(days=1) 表示1天) | delta = timedelta(days=1, hours=2) → 1 day 2 hours |
datetime + timedelta | 加法运算(增加时间间隔) | now = datetime.now(); future = now + timedelta(days=3) → 三天后 |
datetime - timedelta | 减法运算(减少时间间隔) | past = now - timedelta(minutes=30) → 30分钟前 |
< , > , == | 比较两个日期时间对象 | if start_time < end_time: → 判断时间顺序 |
**(4) 格式化与解析**
方法 | 描述 | 示例 |
---|---|---|
strftime(format_str) | 格式化为字符串(类似 C 语言的 printf ) | dt.strftime("%Y-%m-%d %H:%M:%S") → "2024-03-10 14:20:30" |
str(dt) | 直接转换为易读字符串(无时区信息) | str(datetime.now()) → "2024-03-10 14:20:30.123456" |
datetime.strptime(s, format_str) | 将字符串解析为时间对象 | datetime.strptime("2024-03-10 14:20", "%Y-%m-%d %H:%M") → 对应时间对象 |
常用格式化符号:
%Y
:四位年份(如 2024)%m
:两位月份(01-12)%d
:两位日期(01-31)%H
:24小时制小时(00-23)%M
:分钟(00-59)%S
:秒(00-61,含闰秒)
**(5) 时区处理(需 zoneinfo
或 pytz
)**
方法/类 | 描述 | 示例 |
---|---|---|
datetime.timezone.utc | UTC 时区对象 | utc_tz = datetime.timezone.utc |
datetime.replace(tzinfo=timezone) | 设置时区信息 | local_dt = dt.replace(tzinfo=datetime.timezone.timezone.utc) → UTC 时间 |
astimezone(timezone) | 转换时区 | beijing_dt = utc_dt.astimezone(datetime.timezone(timedelta(hours=8))) → 北京时间 |
注意:
- 原生
datetime
不支持时区,需通过tzinfo
属性手动设置(可能引发歧义)。 - 推荐使用
pytz
或zoneinfo
模块处理复杂时区转换。
**(6) 其他实用函数**
函数/属性 | 描述 | 示例 |
---|---|---|
datetime.max / min | 日期时间的最大/最小值 | datetime.max → 9999-12-31 23:59:59.999999 |
datetime.resolution | 时间精度(微秒) | datetime.resolution → timedelta(microseconds=1) |
time() | 获取当前时间(struct_time 格式) | import time; time.time() → 时间戳(浮点数) |
3. 示例代码
from datetime import datetime, timedelta, timezone
# 创建时间对象
dt = datetime(2024, 3, 10, 14, 30)
print("原始时间:", dt) # 2024-03-10 14:30:00
# 时间加减
dt_plus = dt + timedelta(days=2, hours=3)
print("两天三小时后:", dt_plus) # 2024-03-12 17:30:00
# 格式化输出
print(dt.strftime("%Y-%m-%d %H:%M")) # "2024-03-10 14:30"
# 解析字符串
s = "2024-03-10 14:30:00"
dt_parsed = datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
print("解析后的时间:", dt_parsed) # 2024-03-10 14:30:00
# 时区转换(需 Python 3.2+ zoneinfo)
utc_dt = datetime(2024, 3, 10, 14, 30, tzinfo=timezone.utc)
beijing_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
print("北京时间:", beijing_dt) # 2024-03-10 22:30:00+08:00
4. 注意事项
-
时区问题:
- 原生
datetime
不区分时区,跨时区计算可能导致错误(如夏令时调整)。 - 推荐使用
pytz
或zoneinfo
模块处理时区。
- 原生
-
不可变性:
datetime
对象是不可变的,每次修改会生成新对象(性能开销较小)。
-
夏令时(DST):
- 使用
pytz
的localize
方法自动处理夏令时转换。
- 使用
-
时间精度:
- 微秒级精度可通过
microsecond
属性设置,但多数场景只需到秒级。
- 微秒级精度可通过
5. 总结
- 基础操作:
datetime.now()
、strftime
、timedelta
是最常用的函数。 - 复杂场景:时区转换推荐使用
pytz
,日期计算建议结合pandas
或numpy
。 - 替代库:
- 高性能:
numpy.datetime64
- 时区支持:
pytz
、dateutil
- 企业级:
sqlalchemy
(数据库时间处理)
- 高性能:
掌握这些函数后,可以轻松应对大部分日期时间处理需求!