Python: 日期与时间

处理日期和时间是编程中最常见的需求之一——记录日志时间、计算借阅天数、统计某段时间的数据……datetime 模块是 Python 处理日期时间的标准方式。


1. 获取当前时间

PYTHON
from datetime import datetime, date, time

# 当前日期时间
now = datetime.now()
print(now)                      # 2026-06-23 16:00:00.123456

# 当前日期
today = date.today()
print(today)                    # 2026-06-23

# 创建指定日期
d = datetime(2026, 6, 23, 15, 30, 0)
print(d)                        # 2026-06-23 15:30:00

▶ 示例:生日提醒(难度⭐)

PYTHON
from datetime import datetime

def days_to_birthday(birth_str):
    """计算距离生日还有几天"""
    today = datetime.now()
    birth = datetime.strptime(birth_str, "%m-%d")
    birthday_this_year = birth.replace(year=today.year)

    if birthday_this_year < today:
        birthday_this_year = birthday_this_year.replace(year=today.year + 1)

    delta = birthday_this_year - today
    return delta.days

print(f"距离下一个生日还有 {days_to_birthday('12-25')} 天")
▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功


2. 格式化与解析

PYTHON
from datetime import datetime

# 日期 → 字符串(格式化)
now = datetime.now()
print(now.strftime("%Y-%m-%d"))              # 2026-06-23
print(now.strftime("%Y年%m月%d日"))          # 2026年06月23日
print(now.strftime("%H:%M:%S"))              # 16:00:00
print(now.strftime("%A"))                    # Tuesday(星期几)

# 字符串 → 日期(解析)
date_str = "2026-06-23 15:30:00"
parsed = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(parsed)                                # 2026-06-23 15:30:00
格式符 含义 示例
%Y 四位年份 2026
%m 两位月份 06
%d 两位日期 23
%H 小时(24时) 15
%M 分钟 30
%S 00
%A 星期全名 Tuesday
💡 strftime 是"日期→字符串",strptime 是"字符串→日期"。 记不住的话想"f=format, p=parse"——format 是输出,parse 是解析。



3. timedelta:时间差

PYTHON
from datetime import datetime, timedelta

now = datetime.now()

# 计算未来/过去的时间
future = now + timedelta(days=7)
past = now - timedelta(days=30)

print(f"7天后:{future.strftime('%Y-%m-%d')}")
print(f"30天前:{past.strftime('%Y-%m-%d')}")

# 时间计算
print(timedelta(days=7))                     # 7 days, 0:00:00
print(timedelta(hours=3, minutes=15))        # 3:15:00
print(timedelta(weeks=2))                    # 14 days, 0:00:00

# 两个日期相减
d1 = datetime(2026, 6, 1)
d2 = datetime(2026, 6, 23)
diff = d2 - d1
print(f"相差 {diff.days} 天")               # 相差 22 天

▶ 示例:订阅到期提醒(难度⭐⭐)

PYTHON
from datetime import datetime, timedelta

# 模拟用户订阅信息
subscriptions = [
    {"name": "Alice", "expire": "2026-07-15"},
    {"name": "Bob", "expire": "2026-06-25"},
    {"name": "Charlie", "expire": "2026-08-01"},
    {"name": "赵六", "expire": "2026-06-20"},
]

today = datetime.now().strftime("%Y-%m-%d")
today = datetime.strptime(today, "%Y-%m-%d")

print("=== 订阅到期检查 ===")
for sub in subscriptions:
    expire = datetime.strptime(sub["expire"], "%Y-%m-%d")
    remaining = (expire - today).days

    if remaining < 0:
        print(f"🔴 {sub['name']}:已过期 {-remaining} 天")
    elif remaining <= 7:
        print(f"🟡 {sub['name']}:即将到期,还剩 {remaining} 天")
    else:
        print(f"🟢 {sub['name']}:正常,还剩 {remaining} 天")
▶ 试一试

输出:

TEXT 📖 仅展示
=== 订阅到期检查 ===


▶ 示例:项目截止日期计算(难度⭐)

PYTHON
from datetime import datetime, timedelta

def countdown(deadline_str):
    """计算距离截止日期还有多少天"""
    deadline = datetime.strptime(deadline_str, "%Y-%m-%d")
    today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
    diff = (deadline - today).days
    return diff

# 模拟多个项目截止日期
projects = [
    {"name": "课程作业", "deadline": "2026-09-01"},
    {"name": "毕业设计", "deadline": "2026-12-15"},
    {"name": "实习报告", "deadline": "2026-08-20"},
]

print("=== 项目倒计时 ===")
for p in projects:
    days = countdown(p["deadline"])
    if days > 7:
        print(f"🟢 {p['name']}:还剩 {days} 天")
    elif days > 0:
        print(f"🟡 {p['name']}:仅剩 {days} 天!")
    elif days == 0:
        print(f"🔴 {p['name']}:今天截止!")
    else:
        print(f"⚫ {p['name']}:已过期 {-days} 天")

# 计算从今天起 30 天后是哪一天
future = datetime.now() + timedelta(days=30)
print(f"\n30 天后是:{future.strftime('%Y年%m月%d日')}")
▶ 试一试

输出:

TEXT 📖 仅展示
=== 项目倒计时 ===
🟢 课程作业:还剩 22 天
🟢 毕业设计:还剩 127 天
🟡 实习报告:仅剩 10 天!

30 天后是:2026年09月09日


4. 常见应用场景


❓ 常见问题

Q datetime.now() 返回的是本地时间还是 UTC 时间?
A 本地时间。如果需要 UTC 时间用 datetime.utcnow()。但注意 utcnow() 返回的是不带时区信息的 naive 时间。生产环境建议用 datetime.now(timezone.utc)pytz / zoneinfo 处理时区。
Q strptime 解析失败会怎样?
A 抛出 ValueError——"time data 'xxx' does not match format '%Y-%m-%d'"。用 try-except 包起来处理错误情况。常见的坑:月份和日期必须是两位数(%m 不匹配 "6",需要 "06")。
Q timedelta 最大支持多少天?
A 理论上没有上限——timedelta(days=1000000) 也是合法的。但注意 total_seconds() 可能溢出。日常使用完全不用担心范围问题。

📖 小节


📝 作业

  1. 基础题(难度⭐):输出当前时间的以下格式:2026年06月23日 星期二2026-06-23 16:0006/23/2026

  2. 进阶题(难度⭐⭐):写一个函数 workdays_between(start, end),计算两个日期之间有多少个工作日(周一到周五)。提示:用 timedelta 遍历每一天,用 weekday() 判断星期几(0=周一,4=周五)。

  3. 挑战题(难度⭐⭐⭐):写一个"番茄钟"程序。工作 25 分钟 → 休息 5 分钟,循环 4 次后长休息 15 分钟。用 time.sleep() 模拟计时,用 datetime 显示当前阶段和剩余时间。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏