Python 时间序列处理:datetime、time、calendar、zoneinfo 全解
Introduction
时间处理是 Python 开发中的高频需求,也是 Bug 高发区——时区、夏令时、字符串格式,稍不注意就出错。本文用场景驱动讲解所有常用操作。
---
datetime 模块(最常用)
from datetime import datetime, date, time, timedelta
# 当前时间
now = datetime.now()
utc_now = datetime.utcnow()
# datetime ↔ 字符串
now_str = now.strftime("%Y-%m-%d %H:%M:%S")
dt = datetime.strptime("2026-07-24 15:30:45", "%Y-%m-%d %H:%M:%S")
# datetime ↔ 时间戳
ts = now.timestamp()
dt = datetime.fromtimestamp(ts)
# 日期计算
future = now + timedelta(days=7)
past = now - timedelta(hours=12)
diff = (future - past).total_seconds()
时区处理(Python 3.9+ zoneinfo)
from datetime import datetime
from zoneinfo import ZoneInfo
beijing = datetime.now(ZoneInfo("Asia/Shanghai"))
ny = datetime.now(ZoneInfo("America/New_York"))
utc_time = beijing.astimezone(ZoneInfo("UTC"))
print(f"北京: {beijing}")
print(f"纽约: {ny}")
print(f"UTC: {utc_time}")
常用日期计算
# 下个工作日
def next_workday(dt):
next_day = dt + timedelta(days=1)
while next_day.weekday() >= 5:
next_day += timedelta(days=1)
return next_day
# 月初和月末
def month_start(dt):
return dt.replace(day=1, hour=0, minute=0, second=0)
def month_end(dt):
import calendar
last_day = calendar.monthrange(dt.year, dt.month)[1]
return dt.replace(day=last_day, hour=23, minute=59, second=59)
常见问题
Q1: aware 和 naive 区别?naive 无时区信息,aware 带有时区信息。推荐内部存储统一用 UTC aware,输出时转本地时区。
Q2: strftime 和 strptime 区别?strftime:datetime → 字符串(format time)。strptime:字符串 → datetime(parse time)。
Q3: time.time() vs time.perf_counter()?time.time() 是墙上时钟(可能被系统调整影响),time.perf_counter() 专用于计时,不受系统时间影响。
延伸阅读
- Python JSON 处理(时间序列化)
- Python 定时任务(APScheduler)
- HTTP API 时间格式(ISO 8601)
---
作者:小马 | 绍大技术网 shaoda.net