Python 的 datetime
类详解
datetime
是 Python 标准库 datetime
模块中的核心类,用于处理日期和时间。它结合了 date
和 time
类的功能,提供了丰富的日期时间操作方法。
1. 导入模块
from datetime import datetime, timedelta, timezone
2. 创建 datetime
对象
方法 | 描述 | 示例 |
---|---|---|
构造函数 | 直接指定年、月、日等参数 | datetime(2023, 5, 15, 14, 30, 0) |
now() | 当前本地日期和时间 | datetime.now() |
utcnow() | 当前 UTC 日期和时间 | datetime.utcnow() |
fromtimestamp() | 将时间戳转为 datetime | datetime.fromtimestamp(1684000000) |
strptime() | 从字符串解析时间 | datetime.strptime("2023-05-15", "%Y-%m-%d") |
示例:
# 手动创建
dt1 = datetime(2023, 5, 15, 14, 30, 0)
print(dt1) # 输出: 2023-05-15 14:30:00
# 当前时间
dt2 = datetime.now()
print(f"当前时间: {dt2}")
# 解析字符串
dt3 = datetime.strptime("2023-05-15 14:30", "%Y-%m-%d %H:%M")
print(dt3) # 输出: 2023-05-15 14:30:00
3. 常用属性
属性 | 描述 | 取值示例 |
---|---|---|
year | 年份 | 2023 |
month | 月份 | 1-12 |
day | 日 | 1-31 |
hour | 小时 | 0-23 |
minute | 分钟 | 0-59 |
second | 秒 | 0-59 |
microsecond | 微秒 | 0-999999 |
tzinfo | 时区信息 | None 或 timezone 对象 |
示例:
dt = datetime(2023, 5, 15, 14, 30, 45, 123456)
print(dt.year) # 2023
print(dt.microsecond) # 123456
4. 日期时间操作
a. 格式化输出:strftime()
将 datetime
转为格式化的字符串。
常用格式代码:
%Y
:四位年份(如 2023)%m
:两位月份(01-12)%d
:两位日(01-31)%H
:24小时制小时(00-23)%M
:分钟(00-59)%S
:秒(00-59)
示例:
dt = datetime.now()
formatted = dt.strftime("%Y-%m-%d %H:%M:%S")
print(formatted) # 如: "2023-05-15 14:30:00"
custom_format = dt.strftime("现在是 %Y 年 %m 月,时间 %H 点 %M 分")
print(custom_format) # 如: "现在是 2023 年 05 月,时间 14 点 30 分"
b. 时间替换:replace()
生成一个修改部分属性的新对象(原对象不可变)。
dt = datetime(2023, 5, 15, 14, 30)
new_dt = dt.replace(year=2024, hour=15)
print(new_dt) # 输出: 2024-05-15 15:30:00
c. 时间差计算:timedelta
- 日期加减
- 计算两个时间的差值
示例:
# 加减时间
dt = datetime(2023, 5, 15)
delta = timedelta(days=2, hours=6)
new_dt = dt + delta
print(new_dt) # 输出: 2023-05-17 06:00:00
# 计算时间差
dt1 = datetime(2023, 5, 15)
dt2 = datetime(2023, 5, 20)
diff = dt2 - dt1
print(diff.days) # 输出: 5
5. 时区处理
a. 添加时区
# 创建带时区的时间(UTC+8)
tz = timezone(timedelta(hours=8))
dt = datetime(2023, 5, 15, 14, 30, tzinfo=tz)
print(dt) # 输出: 2023-05-15 14:30:00+08:00
b. 时区转换
# UTC 时间
utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
print(utc_dt) # 如: 2023-05-15 06:30:00+00:00
# 转换为北京时间(UTC+8)
bj_tz = timezone(timedelta(hours=8))
bj_dt = utc_dt.astimezone(bj_tz)
print(bj_dt) # 如: 2023-05-15 14:30:00+08:00
6. 其他实用方法
a. 转换为 date
或 time
dt = datetime.now()
# 提取日期部分
date_part = dt.date() # 返回 date 对象
print(date_part) # 如: 2023-05-15
# 提取时间部分
time_part = dt.time() # 返回 time 对象
print(time_part) # 如: 14:30:00.123456
b. 时间戳转换
dt = datetime(2023, 5, 15, 0, 0)
# 转时间戳(秒级)
timestamp = dt.timestamp()
print(timestamp) # 输出: 1684108800.0
# 从时间戳恢复
restored_dt = datetime.fromtimestamp(1684108800)
print(restored_dt) # 输出: 2023-05-15 08:00:00(注意本地时区)
注意事项
- 不可变性:
datetime
对象不可修改,操作会返回新对象。 - 时区问题:默认创建的
datetime
对象没有时区信息(称为 “naive”),处理跨时区问题需谨慎。 - 输入范围:月份为
1-12
,小时为0-23
,否则会抛出ValueError
。
通过上述方法,可以高效处理绝大多数日期时间操作,满足日志记录、数据分析、定时任务等场景需求。