datetime,一个实用的 Python 库!

【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 永远是你的起点和核心依赖。

你在实际项目中遇到过哪些因时间处理不当引发的“灵异事件”?或者有什么独门的时间处理技巧?欢迎在评论区分享交流,让我们一起写出更健壮的代码!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值