Python 的 datetime
模块是标准库中用于处理日期和时间的核心模块。它提供了多种类和工具,方便开发者操作日期、时间、时间间隔以及时区信息。以下是其主要功能及组件:
1.1 datetime.date
from datetime import date
today = date.today() # 获取当前日期
print(today) # 输出格式:2023-10-05
1.2 datetime.time
from datetime import time
t = time(14, 30, 15) # 14点30分15秒
print(t) # 输出:14:30:15
1.3 datetime.datetime
from datetime import datetime
now = datetime.now() # 当前日期和时间
print(now) # 输出:2023-10-05 14:30:15.123456
1.4 datetime.timedelta
from datetime import datetime, timedelta
now = datetime.now()
tomorrow = now + timedelta(days=1) # 当前时间加1天
1.5 datetime.tzinfo
(抽象基类)
pytz
)实现具体时区操作。from datetime import datetime, date
# 创建特定日期或时间
dt = datetime(2023, 10, 5, 14, 30) # 2023年10月5日 14:30:00
d = date(2023, 10, 5) # 仅日期
# 获取当前时间
current_time = datetime.now()
strftime
):将日期时间转为字符串。formatted = dt.strftime("%Y-%m-%d %H:%M:%S") # 输出:2023-10-05 14:30:00
strptime
):将字符串转为日期时间对象。parsed = datetime.strptime("2023-10-05", "%Y-%m-%d")
delta = timedelta(days=7, hours=3)
new_date = dt + delta # 加7天3小时
datetime
对象是“无时区”(naive),需借助 pytz
库处理时区:import pytz
utc_time = datetime.now(pytz.utc) # UTC时间
local_time = utc_time.astimezone(pytz.timezone("Asia/Shanghai")) # 转为上海时区
以下是针对 Python datetime 模块在四种典型应用场景中的具体代码实例及详细说明:
场景:在应用程序中记录关键操作的时间戳。
代码示例:
from datetime import datetime
def log_event(event: str, log_file: str = "app.log"):
"""记录带时间戳的事件到日志文件"""
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_entry = f"[{current_time}] Event: {event}\n"
with open(log_file, "a") as f:
f.write(log_entry)
print(f"日志已记录:{log_entry.strip()}")
# 示例:记录用户登录事件
log_event("用户 'admin' 登录成功")
log_event("文件 'data.csv' 上传完成")
输出:
日志已记录:[2025-03-09 15:30:45] Event: 用户 'admin' 登录成功
日志已记录:[2025-03-09 15:30:45] Event: 文件 'data.csv' 上传完成
说明:
datetime.now()
获取当前时间,并通过 strftime
格式化为 YYYY-MM-DD HH:MM:SS
。场景:从用户输入或表单中解析日期字符串,并验证其有效性。
代码示例:
from datetime import datetime
def parse_user_date(date_str: str) -> datetime:
"""将用户输入的日期字符串解析为 datetime 对象"""
try:
return datetime.strptime(date_str, "%Y-%m-%d")
except ValueError:
raise ValueError("日期格式错误或无效日期,请输入 YYYY-MM-DD 格式的有效日期")
# 示例:用户输入日期并验证
user_input = "2025-02-30" # 故意输入无效日期
try:
parsed_date = parse_user_date(user_input)
print(f"解析成功:{parsed_date.date()}")
except ValueError as e:
print(f"错误:{e}")
输出:
错误:日期格式错误或无效日期,请输入 YYYY-MM-DD 格式的有效日期
说明:
strptime
解析日期字符串,格式符 %Y-%m-%d
必须与输入严格匹配。ValueError
处理无效日期(如 2025-02-30
不存在)。场景:根据当前时间和处理周期,计算任务的截止时间。
代码示例:
from datetime import datetime, timedelta
def schedule_task(task_name: str, days_to_complete: int) -> dict:
"""根据当前时间生成任务截止时间"""
start_time = datetime.now()
deadline = start_time + timedelta(days=days_to_complete)
return {
"task": task_name,
"start": start_time.strftime("%Y-%m-%d %H:%M"),
"deadline": deadline.strftime("%Y-%m-%d %H:%M")
}
# 示例:创建一个3天后截止的任务
task = schedule_task("生成季度报表", 3)
print(f"任务 '{task['task']}' 创建于 {task['start']},截止时间 {task['deadline']}")
输出:
任务 '生成季度报表' 创建于 2025-03-09 18:26,截止时间 2025-03-12 18:26
说明:
timedelta(days=3)
对当前时间进行加法运算,得到未来时间点。场景:统计两个日期之间的工作日天数(排除周末)。
代码示例:
from datetime import datetime, timedelta
def count_workdays(start: str, end: str) -> int:
"""计算两个日期之间的工作日天数(周一至周五)"""
start_date = datetime.strptime(start, "%Y-%m-%d")
end_date = datetime.strptime(end, "%Y-%m-%d")
delta = end_date - start_date
workdays = 0
for day in range(delta.days + 1):
current_date = start_date + timedelta(days=day)
if current_date.weekday() < 5: # 0=周一, 4=周五
workdays += 1
return workdays
# 示例:计算2025-10-01到2025-10-31的工作日天数
work_days = count_workdays("2025-10-01", "2025-10-31")
print(f"2025年10月的工作日天数为:{work_days}")
输出:
2025年10月的工作日天数为:23
说明:
weekday()
判断是否为工作日(0~4 表示周一到周五)。通过上述代码实例,可以看到 datetime
模块在以下场景中的灵活应用:
实际开发中可结合 pytz
处理时区,或使用 pandas
优化大规模时间数据处理。
2025-02-30
)会抛出 ValueError
。pandas
处理大规模数据)。datetime
模块是 Python 处理日期和时间的标准工具,覆盖了从简单日期操作到复杂时区管理的需求。结合第三方库(如 pytz
、dateutil
)可进一步扩展其功能。