【datetime,一个实用的 Python 库!】
在日常生活和软件开发中,时间处理几乎无处不在。你需要记录用户的操作日志、计算两个事件之间的间隔、设置定时任务、处理不同时区的会议时间,甚至分析股票数据的日期序列……如果没有一个强大而简洁的工具,这些看似简单的任务会变得异常繁琐且容易出错。Python 内置的 datetime 库正是为解决这些问题而生的。它提供了日期、时间、时间差和时区等核心功能,让你能够以面向对象的方式优雅地操作时间,无需手动处理闰年、月份天数等底层细节。无论是清洗数据中的时间字段,还是为后端 API 添加时效性验证,datetime 都是你不可或缺的瑞士军刀。
二、安装库
datetime 是 Python 的标准库模块,因此无需额外安装。你只需要在代码中直接导入即可使用:
python
import datetime from datetime import datetime, date, time, timedelta, timezone
小提示:注意
datetime既是模块名也是模块中的一个类名。通常我们import datetime然后使用datetime.datetime.now(),或者从模块中直接导入datetime类。
三、基本用法
下面通过四个小步骤来掌握 datetime 的核心操作。
1. 获取当前日期和时间
python
from datetime import datetime # 当前本地日期时间 now = datetime.now() print(now) # 2025-03-20 14:35:22.123456 # 当前 UTC 日期时间 utc_now = datetime.utcnow() print(utc_now) # 2025-03-20 06:35:22.123456 # 仅获取当前日期 today = datetime.today().date() print(today) # 2025-03-20
2. 创建指定的日期时间
python
from datetime import datetime # 年, 月, 日, 时, 分, 秒, 微秒 dt = datetime(2025, 12, 25, 10, 30, 45, 123456) print(dt) # 2025-12-25 10:30:45.123456 # 只创建日期(时间默认为00:00:00) d = date(2025, 1, 1) print(d) # 2025-01-01 # 只创建时间 t = time(14, 30, 0) print(t) # 14:30:00
3. 日期时间与字符串的互相转换
python
from datetime import datetime
# 日期时间 → 字符串(格式化)
now = datetime.now()
str_dt = now.strftime("%Y-%m-%d %H:%M:%S")
print(str_dt) # 2025-03-20 14:35:22
# 字符串 → 日期时间(解析)
str_date = "2025-12-25 18:30:00"
dt_obj = datetime.strptime(str_date, "%Y-%m-%d %H:%M:%S")
print(dt_obj) # 2025-12-25 18:30:00
4. 日期时间的运算(时间差)
python
from datetime import datetime, timedelta now = datetime.now() future = now + timedelta(days=5, hours=3) print(future) # 当前时间往后推5天3小时 diff = future - now print(diff.days) # 5 print(diff.seconds) # 10800 (3小时)
四、高级用法
时区处理
datetime 支持 timezone 类,配合 pytz 或 Python 3.9+ 的 zoneinfo 可以处理复杂时区。这里以 Python 3.9+ 为例:
python
from datetime import datetime, timezone, timedelta
from zoneinfo import ZoneInfo
# 创建带时区的 datetime
dt_utc = datetime(2025, 3, 20, 12, 0, 0, tzinfo=timezone.utc)
print(dt_utc)
# 转换到上海时区
shanghai_tz = ZoneInfo("Asia/Shanghai")
dt_shanghai = dt_utc.astimezone(shanghai_tz)
print(dt_shanghai) # 2025-03-20 20:00:00+08:00
# 获取当前本地时间(带时区)
local_now = datetime.now().astimezone()
print(local_now)
时间戳与 datetime 互转
python
from datetime import datetime # datetime → 时间戳 now = datetime.now() timestamp = now.timestamp() print(timestamp) # 1742471722.123456 # 时间戳 → datetime dt_from_ts = datetime.fromtimestamp(timestamp) print(dt_from_ts)
更灵活的相对日期(利用第三方库 dateutil,但保持内置风格)
虽然 datetime 内置的 timedelta 只能处理天、秒、微秒,但可以通过组合实现“下个月的同一天”等复杂逻辑。例如:
python
from datetime import datetime
from calendar import monthrange
def add_month(dt, months=1):
month = dt.month - 1 + months
year = dt.year + month // 12
month = month % 12 + 1
day = min(dt.day, monthrange(year, month)[1])
return dt.replace(year=year, month=month, day=day)
today = datetime(2025, 1, 31)
next_month = add_month(today, 1)
print(next_month) # 2025-02-28
五、实际应用场景
场景1:计算年龄
python
from datetime import date
def calculate_age(birth_date):
today = date.today()
return today.year - birth_date.year - (
(today.month, today.day) < (birth_date.month, birth_date.day)
)
birth = date(1995, 8, 20)
age = calculate_age(birth)
print(f"年龄: {age}")
场景2:检查某个文件是否过期(例如日志保留7天)
python
import os
from datetime import datetime, timedelta
def is_file_expired(filepath, days=7):
mtime = datetime.fromtimestamp(os.path.getmtime(filepath))
return datetime.now() - mtime > timedelta(days=days)
if is_file_expired("app.log", days=7):
print("日志文件已超过7天,可以清理")
场景3:生成某个月的日期范围(用于报表)
python
from datetime import datetime, timedelta
from calendar import monthrange
def get_dates_of_month(year, month):
first_day = datetime(year, month, 1)
last_day = datetime(year, month, monthrange(year, month)[1])
delta = timedelta(days=1)
current = first_day
dates = []
while current <= last_day:
dates.append(current.date())
current += delta
return dates
# 生成2025年3月的所有日期
march_dates = get_dates_of_month(2025, 3)
print(march_dates[:5]) # 前5天
场景4:定时任务判断(例如每天凌晨3点执行备份)
python
from datetime import datetime, time
import time as time_module
def should_run_backup(target_hour=3):
now = datetime.now()
return now.hour == target_hour and now.minute == 0
while True:
if should_run_backup():
print("执行备份...")
# 执行后休眠24小时避免重复
time_module.sleep(86400)
time_module.sleep(60) # 每分钟检查一次
六、总结与互动
datetime 库虽然简单,却是 Python 时间处理的中流砥柱。从获取当前时间、格式化输出,到时区转换、日期运算,它提供了清晰且统一的 API。掌握 datetime 后,你不仅能避免“时间偏移一小时”、“月份天数算错”等经典 Bug,还能轻松构建需要时间逻辑的应用——比如签到系统、会议预定、数据快照等。当然,更复杂的周期规则(如“每月最后一个工作日”)可以结合 calendar 或第三方库 dateutil 实现,但 datetime 永远是你的起点和核心依赖。
你在实际项目中遇到过哪些因时间处理不当引发的“灵异事件”?或者有什么独门的时间处理技巧?欢迎在评论区分享交流,让我们一起写出更健壮的代码!

2644

被折叠的 条评论
为什么被折叠?



