datetime 模块主要包含以下几个核心类:

datetime: 同时包含日期和时间信息。date: 仅包含日期信息(年、月、日)。time: 仅包含时间信息(时、分、秒、微秒)。timedelta: 表示时间间隔或持续时间,用于日期/时间的计算。tzinfo: 时区信息的抽象基类,用于处理不同时区的时间。
基本概念:获取当前时间
你需要导入 datetime 模块,最常用的操作是获取当前的日期和时间。
from datetime import datetime
# 获取当前的日期和时间
now = datetime.now()
print(f"当前完整日期和时间: {now}")
print(f"当前日期: {now.date()}")
print(f"当前时间: {now.time()}")
# 获取当前的日期(使用 date 类)
today = datetime.now().date()
print(f"当前日期 (date 对象): {today}")
输出示例:
当前完整日期和时间: 2025-10-27 15:30:55.123456
当前日期: 2025-10-27
当前时间: 15:30:55.123456
当前日期 (date 对象): 2025-10-27
创建特定的时间点
你可以使用 datetime() 构造函数来创建一个特定的 datetime 对象。
语法: datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)

from datetime import datetime
# 创建一个特定的日期和时间
dt1 = datetime(2025, 10, 27, 10, 30, 0)
print(f"创建的特定时间: {dt1}")
# 创建一个特定的日期(时间部分默认为 00:00:00)
dt2 = datetime(2025, 1, 1)
print(f"创建的特定日期: {dt2}")
输出示例:
创建的特定时间: 2025-10-27 10:30:00
创建的特定日期: 2025-01-01 00:00:00
字符串与 datetime 对象的相互转换
这是最常见的操作之一,比如从文件或数据库中读取时间字符串,或者将时间对象格式化后显示给用户。
1 字符串转 datetime (使用 strptime)
strptime (string parse time) 可以根据指定的格式将字符串解析为 datetime 对象。
from datetime import datetime
date_string = "2025-10-27 15:45:30"
# %Y: 四位年份, %m: 两位月份, %d: 两位日
# %H: 24小时制小时, %M: 分钟, %S: 秒
format_string = "%Y-%m-%d %H:%M:%S"
dt_object = datetime.strptime(date_string, format_string)
print(f"字符串: {date_string}")
print(f"转换后的 datetime 对象: {dt_object}")
print(f"转换后的 datetime 对象类型: {type(dt_object)}")
输出示例:

字符串: 2025-10-27 15:45:30
转换后的 datetime 对象: 2025-10-27 15:45:30
转换后的 datetime 对象类型: <class 'datetime.datetime'>
常用格式化代码:
| 代码 | 含义 | 示例 |
| :--- | :------------------- | :-------------- |
| %Y | 四位年份 | 2025 |
| %y | 两位年份 | 23 |
| %m | 两位月份 (01-12) | 10 |
| %B | 月份全名 | October |
| %b | 月份缩写 | Oct |
| %d | 两位日 (01-31) | 27 |
| %H | 24小时制小时 (00-23) | 15 |
| %I | 12小时制小时 (01-12) | 03 |
| %M | 分钟 (00-59) | 45 |
| %S | 秒 (00-59) | 30 |
| %p | AM/PM 标记 | PM |
2 datetime 转字符串 (使用 strftime)
strftime (string format time) 可以将 datetime 对象格式化为指定的字符串。
from datetime import datetime
dt_object = datetime.now()
# 格式化为 "YYYY-MM-DD HH:MM:SS" 格式
formatted_string1 = dt_object.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式化后的字符串1: {formatted_string1}")
# 格式化为 "DD/MM/YYYY" 格式
formatted_string2 = dt_object.strftime("%d/%m/%Y")
print(f"格式化后的字符串2: {formatted_string2}")
# 格式化为 "Month Day, Year" 格式
formatted_string3 = dt_object.strftime("%B %d, %Y")
print(f"格式化后的字符串3: {formatted_string3}")
输出示例:
格式化后的字符串1: 2025-10-27 15:50:12
格式化后的字符串2: 27/10/2025
格式化后的字符串3: October 27, 2025
时间计算
时间计算的核心是 timedelta 对象。
1 使用 timedelta 进行加减
from datetime import datetime, timedelta
now = datetime.now()
# 计算 3 天后的时间
future_time = now + timedelta(days=3)
print(f"3 天后是: {future_time}")
# 计算 2 小时 30 分钟前的时间
past_time = now - timedelta(hours=2, minutes=30)
print(f"2小时30分钟前是: {past_time}")
# 计算 10 秒后的时间
future_time_seconds = now + timedelta(seconds=10)
print(f"10秒后是: {future_time_seconds}")
2 两个 datetime 对象相减
两个 datetime 对象相减会得到一个 timedelta 对象,表示它们之间的时间差。
from datetime import datetime
start_time = datetime(2025, 1, 1)
end_time = datetime(2025, 10, 27)
time_difference = end_time - start_time
print(f"时间差: {time_difference}")
print(f"时间差的类型: {type(time_difference)}")
# 可以从 timedelta 对象中提取具体的天数、秒数等
print(f"相差的天数: {time_difference.days}")
print(f"相差的秒数: {time_difference.seconds}") # 注意:seconds 不包含天数部分的秒数
print(f"相差的总秒数: {time_difference.total_seconds()}")
输出示例:
时间差: 301 days, 0:00:00
时间差的类型: <class 'datetime.timedelta'>
相差的天数: 301
相差的秒数: 0
相差的总秒数: 26006400.0
访问和修改时间组件
你可以像访问对象的属性一样访问 datetime 对象的各个部分。
from datetime import datetime
dt = datetime(2025, 10, 27, 15, 45, 30, 500000)
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}")
print(f"星期几 (0是周一, 6是周日): {dt.weekday()}")
print(f"星期几 (1是周一, 7是周日): {dt.isoweekday()}")
修改时间组件:
注意:datetime 对象是不可变的,所以修改操作会返回一个新的 datetime 对象。
from datetime import datetime
dt = datetime(2025, 10, 27, 15, 45, 30)
# 将年份改为 2025
new_dt = dt.replace(year=2025)
print(f"修改年份后: {new_dt}")
# 将小时改为 9
new_dt_hour = dt.replace(hour=9)
print(f"修改小时后: {new_dt_hour}")
比较时间
datetime 对象支持标准的比较运算符(<, >, , , <=, >=)。
from datetime import datetime
date1 = datetime(2025, 1, 1)
date2 = datetime(2025, 12, 31)
date3 = datetime(2025, 1, 1)
print(f"date1 < date2: {date1 < date2}") # True
print(f"date1 > date2: {date1 > date2}") # False
print(f"date1 == date3: {date1 == date3}") # True
实用示例:计算年龄
这是一个非常实用的例子,展示了如何组合使用以上技巧。
from datetime import datetime
def calculate_age(birth_date_str):
"""
根据出生日期字符串计算年龄。
:param birth_date_str: 出生日期,格式 'YYYY-MM-DD'
:return: 年龄(整数)
"""
# 1. 将字符串转换为 datetime 对象
birth_date = datetime.strptime(birth_date_str, "%Y-%m-%d").date()
# 2. 获取今天的日期
today = datetime.now().date()
# 3. 计算年份差
age = today.year - birth_date.year
# 4. 检查生日是否已过,如果未过,年龄减1
# (today.month, today.day) < (birth_date.month, birth_date.day) 会比较元组
if (today.month, today.day) < (birth_date.month, birth_date.day):
age -= 1
return age
# 示例
birth_date_str = "1990-05-15"
age = calculate_age(birth_date_str)
print(f"如果出生日期是 {birth_date_str},那么当前年龄是: {age} 岁")
| 功能 | 关键方法/函数 | 示例 |
|---|---|---|
| 获取当前时间 | datetime.now() |
now = datetime.now() |
| 创建特定时间 | datetime() |
dt = datetime(2025, 10, 27) |
| 字符串 -> datetime | datetime.strptime() |
dt = datetime.strptime("2025-10-27", "%Y-%m-%d") |
| datetime -> 字符串 | datetime.strftime() |
s = dt.strftime("%Y/%m/%d") |
| 时间间隔 | timedelta() |
delta = timedelta(days=7) |
| 时间加减 | , | future_time = now + delta |
| 时间差 | (两个datetime相减) | diff = end_time - start_time |
| 访问组件 | .year, .month, .day 等 |
year = dt.year |
| 修改组件 | .replace() |
new_dt = dt.replace(year=2025) |
| 比较时间 | <, >, |
if date1 < date2: |
掌握了这些基本操作,你就可以应对绝大多数与日期和时间相关的编程任务了。
