Python 时间处理详解

发布于:2025-08-18 ⋅ 阅读:(13) ⋅ 点赞:(0)

Python 的时间处理功能超级实用,不管你是想记录程序运行时间、处理日期数据,还是做个倒计时小工具,Python 都提供了好用的模块,比如 timedatetimedateutil。这篇文章会带你从基础到进阶,逐步搞懂 Python 的时间处理!

参考文章:Python 内置模块 datetime | 简单一点学习 easyeasy.me

1. 时间处理的基础概念

什么是时间戳、日期和时间?

时间戳是个大整数,表示从 1970 年 1 月 1 日 00:00:00 UTC(Unix 纪元)到现在的秒数。日期和时间就更好理解了,比如“2025年8月17日 18:04”就是日期和时间的组合。Python 提供了好几个模块来处理这些东西,核心是 timedatetime

Python 的时间相关模块简介

  • time 模块:适合低级别的时间操作,比如获取时间戳、暂停程序。
  • datetime 模块:功能强大,适合处理日期、时间、时区等。
  • dateutil 模块:第三方库,解析复杂日期字符串和高级运算很方便。
  • pytz 模块:专门用来处理时区。

先装好需要的库,尤其是 dateutilpytz

pip install python-dateutil pytz

2. 用 time 模块处理时间

time 模块是 Python 的基础时间模块,简单粗暴,适合快速搞定时间戳和基本时间操作。

获取当前时间和时间戳

time.time() 获取当前时间戳,单位是秒:

import time

# 获取当前时间戳
timestamp = time.time()
print(f"当前时间戳: {timestamp}")

# 转成人类能看懂的时间
local_time = time.localtime(timestamp)
print(f"本地时间: {local_time}")

输出可能是:

当前时间戳: 1745089440.123456
本地时间: time.struct_time(tm_year=2025, tm_mon=8, tm_mday=17, tm_hour=18, tm_min=4, tm_sec=0, ...)

time.localtime() 返回一个结构体,包含年、月、日、小时等信息。如果想要 UTC 时间,用 time.gmtime()

格式化时间字符串

直接看 struct_time 有点晕,我们可以用 time.strftime() 把时间转成好看的字符串:

import time

# 当前时间转成字符串
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(f"格式化时间: {formatted_time}")

输出:

格式化时间: 2025-08-17 18:04:00

格式化符号常见的有:

  • %Y:四位年份(2025)
  • %m:两位月份(08)
  • %d:两位日期(17)
  • %H:24小时制小时(18)
  • %M:分钟(04)
  • %S:秒(00)

暂停程序(sleep)

想让程序歇一会儿?用 time.sleep(),单位是秒:

import time

print("开始")
time.sleep(2)  # 暂停 2 秒
print("2秒后")

3. 用 datetime 模块处理日期和时间

datetime 模块功能更强大,适合复杂的日期和时间操作。它包含几个核心类:

  • datetime.date:处理日期(年月日)
  • datetime.time:处理时间(时分秒)
  • datetime.datetime:日期 + 时间
  • datetime.timedelta:时间差

创建和操作日期对象

创建日期对象很简单:

from datetime import date, datetime

# 今天的日期
today = date.today()
print(f"今天是: {today}")

# 自定义日期
my_birthday = date(2025, 8, 17)
print(f"我的生日: {my_birthday}")

输出:

今天是: 2025-08-17
我的生日: 2025-08-17

datetime 对象可以同时处理日期和时间:

from datetime import datetime

# 当前日期和时间
now = datetime.now()
print(f"现在是: {now}")

# 自定义日期时间
party_time = datetime(2025, 12, 31, 23, 59, 59)
print(f"派对时间: {party_time}")

输出:

现在是: 2025-08-17 18:04:00.123456
派对时间: 2025-12-31 23:59:59

时间运算(加减时间)

timedelta 做时间加减法,超级方便:

from datetime import datetime, timedelta

now = datetime.now()
print(f"现在: {now}")

# 加 3 天
three_days_later = now + timedelta(days=3)
print(f"3天后: {three_days_later}")

# 减 2 小时
two_hours_ago = now - timedelta(hours=2)
print(f"2小时前: {two_hours_ago}")

输出:

现在: 2025-08-17 18:04:00.123456
3天后: 2025-08-20 18:04:00.123456
2小时前: 2025-08-17 16:04:00.123456

格式化日期和时间

datetime 对象的 strftime 方法和 time 模块的格式化类似:

from datetime import datetime

now = datetime.now()
formatted = now.strftime("%Y年%m月%d日 %H:%M:%S")
print(f"格式化: {formatted}")

输出:

格式化: 2025年08月17日 18:04:00

反过来,把字符串转回 datetime 对象用 strptime

from datetime import datetime

date_str = "2025-08-17 18:04:00"
parsed_date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(f"解析后的时间: {parsed_date}")

时区处理

时区是个容易踩坑的地方,用 pytz 模块可以轻松搞定:

from datetime import datetime
import pytz

# 当前时间(带时区)
tz = pytz.timezone("Asia/Shanghai")
now_shanghai = datetime.now(tz)
print(f"上海时间: {now_shanghai}")

# 转到纽约时间
tz_ny = pytz.timezone("America/New_York")
now_ny = now_shanghai.astimezone(tz_ny)
print(f"纽约时间: {now_ny}")

输出:

上海时间: 2025-08-17 18:04:00+08:00
纽约时间: 2025-08-17 06:04:00-04:00

4. 用 dateutil 模块扩展功能

dateutil 是个超级好用的第三方库,适合处理复杂或不规则的日期时间。

解析模糊日期字符串

dateutil.parser 能解析各种奇奇怪怪的日期字符串:

from dateutil.parser import parse

# 解析各种格式
dates = [
    "2025-08-17",
    "Aug 17, 2025",
    "17/08/2025",
    "2025.08.17 18:04"
]

for d in dates:
    parsed = parse(d)
    print(f"解析 {d}: {parsed}")

输出:

解析 2025-08-17: 2025-08-17 00:00:00
解析 Aug 17, 2025: 2025-08-17 00:00:00
解析 17/08/2025:  accepte2025-08-17 00:00:00
解析 2025.08.17 18:04: 2025-08-17 18:04:00

处理复杂的日期运算

dateutilrelativedeltatimedelta 更灵活,支持按月、年运算:

from datetime import datetime
from dateutil.relativedelta import relativedelta

now = datetime.now()
print(f"现在: {now}")

# 加 1 年 2 个月
future = now + relativedelta(years=1, months=2)
pgprint(f"1年2个月后: {future}")

输出:

现在: 2025-08-17 18:04:00.123456
1年2个月后: 2026-10-17 18:04:00.123456

5. 常见时间处理场景

计算程序运行时间

想知道代码跑了多久?用 time.perf_counter()

import time

start = time.perf_counter()
# 模拟耗时操作
time.sleep(1)
end = time.perf_counter()

print(f"程序运行时间: {end - start:.2f} 秒")

输出:

程序运行时间: 1.00 秒

处理文件时间戳

检查文件的创建或修改时间:

import os
from datetime import datetime

file_path = "example.txt"
# 创建一个文件
with open(file_path, "w") as f:
    f.write("Hello!")

# 获取文件的修改时间
mtime = os.path.getmtime(file_path)
mtime_dt = datetime.fromtimestamp(mtime)
print(f"文件最后修改时间: {mtime_dt}")

定时任务示例

time.sleep 实现简单的定时任务:

import time
from datetime import datetime

def task():
    print(f"任务执行时间: {datetime.now()}")

# 每 5 秒执行一次任务,运行 3 次
for _ in range(3):
    task()
    time.sleep(5)

6. 注意事项和最佳实践

时区问题怎么破?

  • 总是用 pytz 处理时区,避免硬编码时间偏移。
  • 保存时间时,尽量用 UTC,显示时再转本地时间。
  • 注意夏令时(DST),用 pytznormalize 方法处理。

性能优化小技巧

  • time.perf_counter() 而不是 time.time() 来测运行时间,精度更高。
  • 批量处理日期时,尽量复用 datetime 对象,避免重复创建。
  • 解析大量日期字符串时,dateutil.parser 可能比 datetime.strptime 慢,优先用后者如果格式固定。

常见错误和解决方案

  • 错误:字符串格式不匹配
    比如 datetime.strptime("2025-08-17", "%Y/%m/%d") 会报错。检查格式字符串是否正确。
  • 错误:时区未设置
    datetime.now() 拿到的时间没有时区信息,改用 datetime.now(pytz.UTC)
  • 错误:时间戳溢出
    32 位系统可能在 2038 年后溢出,尽量用 64 位 Python。

网站公告

今日签到

点亮在社区的每一天
去签到