模块概览
datetime 模块主要包含以下几个类:

datetime类: 这是最常用的类,它包含了日期和时间信息(年、月、日、时、分、秒、微秒)。date类: 只包含日期信息(年、月、日)。time类: 只包含时间信息(时、分、秒、微秒)。timedelta类: 表示两个datetime对象之间的时间差(持续时间)。tzinfo类: 时区信息的抽象基类,通常我们使用其子类timezone来处理时区。
datetime 类 - 核心操作
创建 datetime 对象
你可以通过多种方式创建 datetime 对象。
a) 获取当前日期和时间
使用 datetime.now(),它会返回一个包含本地时区信息的 datetime 对象。
from datetime import datetime
# 获取当前的日期和时间
now = datetime.now()
print(f"当前时间: {now}")
print(f"类型: {type(now)}")
# 输出示例:
# 当前时间: 2025-10-27 15:30:45.123456
# 类型: <class 'datetime.datetime'>
如果你需要获取 UTC(协调世界时)时间,使用 datetime.utcnow()。

utc_now = datetime.utcnow()
print(f"当前UTC时间: {utc_now}")
b) 从字符串创建 datetime 对象
使用 datetime.strptime()(parse time 的缩写),你需要提供一个格式字符串来匹配输入的日期时间字符串。
from datetime import datetime
# 字符串 -> datetime
date_string = "2025-10-27 15:30:00"
dt_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"转换后的datetime对象: {dt_object}")
print(f"类型: {type(dt_object)}")
# 输出示例:
# 转换后的datetime对象: 2025-10-27 15:30:00
# 类型: <class 'datetime.datetime'>
常用格式化符号:
| 符号 | 含义 | 示例 |
|---|---|---|
%Y |
4位数字的年份 | 2025 |
%m |
2位数字的月份 | 10 |
%d |
2位数字的日 | 27 |
%H |
24小时制的小时 (0-23) | 15 |
%I |
12小时制的小时 (1-12) | 03 |
%M |
分钟 (0-59) | 30 |
%S |
秒 (0-59) | 00 |
%f |
微秒 (0-999999) | 123456 |
%A |
本地化的星期名称 | Friday |
%B |
本地化的月份名称 | October |
c) 从整数创建 datetime 对象

使用 datetime() 构造函数直接传入年、月、日等参数。
from datetime import datetime
# 直接构造
dt_custom = datetime(2025, 10, 27, 10, 30, 0)
print(f"自定义时间: {dt_custom}")
# 输出示例:
# 自定义时间: 2025-10-27 10:30:00
datetime 对象的属性
一旦你有了 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()}") # 注意:weekday() 返回 0-6
print(f"星期几 (1是周一, 7是周日): {dt.isoweekday()}") # isoweekday() 返回 1-7
datetime 对象的格式化与解析
a) 将 datetime 对象转为字符串
使用 strftime()(format time 的缩写)。
from datetime import datetime
now = datetime.now()
# 格式化为字符串
formatted_string = now.strftime("%Y年%m月%d日 %H:%M:%S")
print(f"格式化后的字符串: {formatted_string}")
# 输出示例 (取决于当前时间):
# 格式化后的字符串: 2025年10月27日 15:45:30
b) 将字符串转为 datetime 对象
这就是前面提到的 strptime()。
date_str = "2025-12-25"
dt_object = datetime.strptime(date_str, "%Y-%m-%d")
print(f"从字符串转换: {dt_object}")
date 和 time 类
date 类
只处理日期。
from datetime import date, time
# 获取当前日期
today = date.today()
print(f"今天日期: {today}")
# 创建特定日期
birthday = date(1990, 5, 15)
print(f"生日: {birthday}")
# 访问属性
print(f"年份: {birthday.year}, 月份: {birthday.month}, 日期: {birthday.day}")
# 格式化
print(f"格式化 (ISO): {birthday.isoformat()}") # 输出: 1990-05-15
time 类
只处理时间。
from datetime import time
# 创建特定时间
lunch_time = time(12, 30, 0)
print(f"午餐时间: {lunch_time}")
# 创建带微秒的时间
meeting_time = time(14, 0, 0, 500000)
print(f"会议时间: {meeting_time}")
# 访问属性
print(f"小时: {meeting_time.hour}, 分钟: {meeting_time.minute}")
timedelta 类 - 时间计算
timedelta 用于表示一个时间间隔,常用于日期时间的加减运算。
from datetime import datetime, timedelta
now = datetime.now()
# 创建一个时间差:1天
one_day = timedelta(days=1)
# 计算明天和昨天
tomorrow = now + one_day
yesterday = now - one_day
print(f" {now}")
print(f"明天: {tomorrow}")
print(f"昨天: {yesterday}")
# 创建更复杂的时间差
two_weeks_and_three_hours = timedelta(weeks=2, hours=3)
future_date = now + two_weeks_and_three_hours
print(f"两周三小时后: {future_date}")
重要提示: timedelta 的内部单位是“天”和“秒”,当你用 timedelta(days=1) 时,它表示的是精确的 24 小时,在夏令时等情况下,这可能会导致本地时间出现不连续的跳变(凌晨 2 点跳到凌晨 3 点),但在绝大多数业务场景下,这种影响可以忽略。
时区处理 (Timezones)
处理时区是编程中的一个重要环节,Python 3.2+ 的 datetime 模块内置了 timezone 类来简化时区操作。
a) 使用 UTC 时区
from datetime import datetime, timezone, timedelta
# 创建一个带 UTC 时区的 datetime 对象
utc_now = datetime.now(timezone.utc)
print(f"当前UTC时间: {utc_now}")
# 输出示例:
# 当前UTC时间: 2025-10-27 07:45:30.123456+00:00
b) 创建带特定时区的 datetime 对象
# 创建一个东八区 (UTC+8) 的时区对象
tz_beijing = timezone(timedelta(hours=8))
# 创建一个带有时区信息的 datetime
beijing_time = datetime(2025, 10, 27, 15, 30, 0, tzinfo=tz_beijing)
print(f"北京时间: {beijing_time}")
# 使用 pytz 库 (更强大,推荐)
# pip install pytz
import pytz
tz_shanghai = pytz.timezone('Asia/Shanghai')
shanghai_time = datetime(2025, 10, 27, 15, 30, 0, tzinfo=tz_shanghai)
print(f"上海时间: {shanghai_time}")
c) 时区转换
时区转换的关键是先将 datetime 对象转换为 UTC 时间(如果它不是),然后从 UTC 时间转换到目标时区。
from datetime import datetime, timezone
import pytz
# 假设我们有一个纽约时间
tz_ny = pytz.timezone('America/New_York')
ny_time = datetime(2025, 10, 27, 10, 30, 0, tzinfo=tz_ny)
print(f"纽约时间: {ny_time}")
# 1. 将纽约时间转换为 UTC
# astimezone() 会自动处理时区转换
utc_time = ny_time.astimezone(timezone.utc)
print(f"对应的UTC时间: {utc_time}")
# 2. 将 UTC 时间转换为北京时间
tz_beijing = pytz.timezone('Asia/Shanghai')
beijing_time = utc_time.astimezone(tz_beijing)
print(f"对应的北京时间: {beijing_time}")
实用示例
示例 1: 计算两个日期之间的天数差
from datetime import datetime
start_date = datetime(2025, 1, 1)
end_date = datetime(2025, 12, 31)
time_difference = end_date - start_date
print(f"从 {start_date} 到 {end_date} 的天数差是: {time_difference.days} 天")
示例 2: 计算年龄
from datetime import datetime
def calculate_age(birth_date_str):
birth_date = datetime.strptime(birth_date_str, "%Y-%m-%d")
today = datetime.now()
# 先计算年份差
age = today.year - birth_date.year
# 如果今年的生日还没到,年龄减1
if (today.month, today.day) < (birth_date.month, birth_date.day):
age -= 1
return age
age = calculate_age("1990-05-15")
print(f"你的年龄是: {age} 岁")
示例 3: 判断是否为工作日
from datetime import datetime
def is_weekend(dt):
# weekday() 返回 0-6 (0是周一)
return dt.weekday() >= 5
now = datetime.now()
if is_weekend(now):
print("今天是周末!")
else:
print("今天是工作日。")
| 功能 | 函数/方法 | 描述 |
|---|---|---|
| 创建对象 | datetime.now() |
获取当前本地 datetime |
datetime.utcnow() |
获取当前 UTC datetime |
|
datetime.strptime(s, fmt) |
从字符串解析 datetime |
|
datetime(y, m, d, ...) |
直接构造 datetime |
|
| 格式化/解析 | dt_object.strftime(fmt) |
将 datetime 格式化为字符串 |
dt_object.strptime(s, fmt) |
将字符串解析为 datetime |
|
| 属性访问 | dt_object.year, .month, ... |
访问年、月、日、时等属性 |
| 时间计算 | datetime + timedelta |
加上时间间隔 |
datetime - timedelta |
减去时间间隔 | |
dt1 - dt2 |
计算两个 datetime 的时间差 (timedelta 对象) |
|
| 时区 | dt.astimezone(tz) |
转换时区 |
pytz.timezone('...') |
(使用 pytz 库) 获取特定时区 |
datetime 模块功能强大,是 Python 中处理时间相关任务不可或缺的工具,掌握它的基本用法会让你在处理日期、时间、时间差和时区问题时游刃有余。
