it编程 > 前端脚本 > Python

python time包精讲及异常处理

3人参与 2026-08-07 Python

一、time包底层实现与核心依赖

time 包是 python 对操作系统 c 标准库 <time.h> 的封装,不同操作系统的实现存在差异:

二、time包全量 api 详解(按功能分类)

1. 基础常量

表格

常量说明示例(linux)
time.timezone本地时区与 utc 的差值(秒,西半球为正,东半球为负)-28800(东 8 区,即 - 8*3600)
time.altzone本地夏令时时区与 utc 的差值(秒)-32400
time.daylight是否启用夏令时(0 = 否,1 = 是)0
time.clocks_per_sec每秒的时钟滴答数(用于 clock() 函数)1000000
# 查看时间常量
import time

print("本地时区与utc差值(秒):", time.timezone)       # 东8区输出 -28800
print("夏令时时区与utc差值(秒):", time.altzone)    # 东8区夏令时输出 -32400
print("是否启用夏令时:", time.daylight)             # 国内无夏令时,输出 0
print("每秒时钟滴答数:", time.clocks_per_sec)       # 输出 1000000

2. 时钟与时间获取函数(全量)

函数语法返回值跨平台支持核心用途
time.time()time.time()浮点数时间戳全平台获取当前时间戳(unix 纪元起),精度系统依赖
time.localtime([ts])time.localtime(timestamp=none)struct_time全平台时间戳转本地时区结构化时间
time.gmtime([ts])time.gmtime(timestamp=none)struct_time全平台时间戳转 utc 结构化时间
time.ctime([ts])time.ctime(timestamp=none)字符串全平台时间戳转本地可读字符串(固定格式)
time.asctime([st])time.asctime(tuple=none)字符串全平台结构化时间转固定格式字符串
time.mktime(st)time.mktime(tuple)浮点数时间戳全平台本地结构化时间转时间戳(localtime() 逆操作)
time.perf_counter()time.perf_counter()浮点数(秒)全平台高精度计时器,单调递增,含休眠时间
time.perf_counter_ns()time.perf_counter_ns()整数(纳秒)3.7+高精度计时器(纳秒级,避免浮点误差)
time.monotonic()time.monotonic()浮点数(秒)3.3+单调时钟,不受系统时间修改影响
time.monotonic_ns()time.monotonic_ns()整数(纳秒)3.7+单调时钟(纳秒级)
time.process_time()time.process_time()浮点数(秒)3.3+程序占用 cpu 时间,不含休眠
time.process_time_ns()time.process_time_ns()整数(纳秒)3.7+cpu 时间(纳秒级)
time.thread_time()time.thread_time()浮点数(秒)3.7+线程占用 cpu 时间,不含休眠
time.thread_time_ns()time.thread_time_ns()整数(纳秒)3.7+线程 cpu 时间(纳秒级)
time.clock()time.clock()浮点数3.3 - 废弃旧版计时函数,3.8 + 移除(改用 perf_counter()
time.get_clock_info(name)time.get_clock_info(name)命名元组3.3+获取时钟的详细信息(精度、是否单调、是否可调)
# 全量时钟函数示例
import time

# 1. 时间戳与结构化时间互转
ts = time.time()
st_local = time.localtime(ts)
st_utc = time.gmtime(ts)
ts_back = time.mktime(st_local)  # 本地结构化时间转回时间戳
print(f"原时间戳:{ts:.6f},转回后:{ts_back:.6f}")  # 精度一致

# 2. 纳秒级计时(避免浮点误差)
start_ns = time.perf_counter_ns()
time.sleep(0.1)
end_ns = time.perf_counter_ns()
print(f"耗时(纳秒):{end_ns - start_ns}")  # 输出≈100000000纳秒

# 3. 线程cpu时间
import threading
def thread_func():
    start = time.thread_time_ns()
    for i in range(1000000):
        pass
    end = time.thread_time_ns()
    print(f"线程cpu耗时:{end - start} 纳秒")

t = threading.thread(target=thread_func)
t.start()
t.join()

# 4. 查看时钟信息
for clock_name in ["time", "perf_counter", "monotonic", "process_time"]:
    info = time.get_clock_info(clock_name)
    print(f"\n{clock_name} 时钟信息:")
    print(f"  分辨率:{info.resolution} 秒")
    print(f"  是否单调:{info.monotonic}")
    print(f"  是否可调:{info.adjustable}")

3. 时间格式化与解析函数(全量占位符)

strftime()/strptime() 支持的所有占位符(按类别整理),标注跨平台兼容性

类别占位符含义示例跨平台支持
年份%y4 位年份2026全平台
%y2 位年份(00-99)26全平台
月份%m2 位月份(01-12)03全平台
%b月份缩写(英文)mar全平台
%b月份全称(英文)march全平台
日期%d2 位日期(01-31)03全平台
%j年内第几天(001-366)062全平台
时间%h24 小时制小时(00-23)14全平台
%i12 小时制小时(01-12)02全平台
%m2 位分钟(00-59)30全平台
%s2 位秒数(00-59)45全平台
%f微秒(000000-999999)123456python 扩展
周期%w星期(0 = 周日,6 = 周六)2全平台
%u年内第几周(周日为一周起点)09全平台
%w年内第几周(周一为一周起点)09全平台
时区 / 格式%z时区名称cst仅 linux/macos
%z时区偏移(±hhmm)+08003.2+
%c本地默认时间格式tue mar 3 14:30:45 2026全平台
%x本地默认日期格式03/03/26全平台
%x本地默认时间格式14:30:45全平台
特殊字符%%转义百分号%全平台
%pam/pm(12 小时制)pm全平台
# 全量占位符示例
st = time.localtime()

# 1. 微秒级格式化(python扩展)
time_micro = time.strftime("%y-%m-%d %h:%m:%s.%f", st)
print("微秒级时间:", time_micro)  # 输出:2026-03-03 14:30:45.123456

# 2. 时区偏移(±hhmm)
time_tz = time.strftime("%y-%m-%d %h:%m:%s %z", st)
print("带时区偏移的时间:", time_tz)  # 输出:2026-03-03 14:30:45 +0800

# 3. 年内第几周(周一为起点)
week_info = time.strftime("今年第%w周(周一为起点)", st)
print(week_info)  # 输出:今年第09周(周一为起点)

# 4. 本地默认格式
local_date = time.strftime("%x", st)
local_time = time.strftime("%x", st)
print("本地日期格式:", local_date)  # 输出:03/03/26
print("本地时间格式:", local_time)  # 输出:14:30:45

4. 延时与控制函数

函数语法跨平台支持核心说明
time.sleep(secs)time.sleep(seconds)全平台程序休眠指定秒数(支持浮点数),休眠时释放 gil(多线程可并行休眠)
time.tzset()time.tzset()仅 linux/macos加载环境变量 tz 并更新时区设置,windows 无此函数
# sleep 高级用法:分段休眠(避免长时间阻塞)
def safe_sleep(total_seconds, chunk=0.1):
    """
    分段休眠,避免单次休眠过长导致程序无法中断
    :param total_seconds: 总休眠时间
    :param chunk: 每次休眠的小时间段
    """
    remaining = total_seconds
    while remaining > 0:
        sleep_time = min(chunk, remaining)
        time.sleep(sleep_time)
        remaining -= sleep_time
        # 可在此处添加中断逻辑(如检测信号)
        print(f"剩余休眠时间:{remaining:.2f} 秒")

# 测试分段休眠(总休眠1秒,每次休眠0.1秒)
print("开始分段休眠...")
safe_sleep(1.0)
print("分段休眠结束!")

# tzset 用法(仅linux/macos)
import os
if os.name == "posix":
    # 设置时区为纽约(西5区)
    os.environ["tz"] = "america/new_york"
    time.tzset()
    print("纽约时间:", time.strftime("%y-%m-%d %h:%m:%s %z", time.localtime()))
    # 恢复时区为上海
    os.environ["tz"] = "asia/shanghai"
    time.tzset()
    print("上海时间:", time.strftime("%y-%m-%d %h:%m:%s %z", time.localtime()))
else:
    print("⚠️ windows不支持tzset(),建议用datetime模块处理时区")

三、跨平台差异与兼容性处理

差异点linux/macoswindows兼容方案
时间戳范围无严格限制(64 位系统)32 位 python:1970-2038(2^31-1)使用 64 位 python,或用 datetime 处理超范围时间
时区函数支持 tzset()%z 解析不支持 tzset()%z 解析失败避免依赖 %z,用 %z 或 utc 时间戳存储
时钟精度纳秒级(perf_counter)毫秒级→纳秒级(3.7 + 优化)优先使用 perf_counter_ns() 避免浮点精度问题
休眠精度微秒级约 10-15 毫秒(系统定时器精度)短时间休眠用 perf_counter 补偿,或使用 ctypes 调用系统高精度定时器
# 跨平台高精度休眠(补偿windows休眠精度)
def high_precision_sleep(seconds):
    """
    高精度休眠,适配windows系统的低精度sleep
    :param seconds: 目标休眠时间(秒)
    """
    start = time.perf_counter()
    while time.perf_counter() - start < seconds:
        # 空循环等待,直到达到目标时间
        pass

# 测试高精度休眠(休眠0.001秒=1毫秒)
import datetime
start = datetime.datetime.now()
high_precision_sleep(0.001)
end = datetime.datetime.now()
actual = (end - start).total_seconds()
print(f"目标休眠:0.001秒,实际休眠:{actual:.6f}秒")

四、性能优化与最佳实践

1. 计时性能优化

# 优化前:循环内频繁调用计时函数
def slow_timer():
    start = time.perf_counter()
    for i in range(1000000):
        current = time.perf_counter()  # 100万次函数调用,耗时高
    end = time.perf_counter()
    print(f"优化前耗时:{end - start:.6f}秒")

# 优化后:仅在循环前后调用
def fast_timer():
    start = time.perf_counter()
    for i in range(1000000):
        pass
    end = time.perf_counter()
    print(f"优化后耗时:{end - start:.6f}秒")

slow_timer()
fast_timer()

2. 格式化性能优化

import functools

# 预编译格式化函数
@functools.lru_cache(maxsize=none)
def get_formatter(format_str):
    """缓存格式化函数,避免重复解析格式字符串"""
    def formatter(struct_time):
        return time.strftime(format_str, struct_time)
    return formatter

# 测试批量格式化(10万次)
format_str = "%y-%m-%d %h:%m:%s"
formatter = get_formatter(format_str)
st = time.localtime()

start = time.perf_counter()
for i in range(100000):
    formatter(st)
end = time.perf_counter()
print(f"批量格式化耗时:{end - start:.6f}秒")

五、异常处理与容错机制

time 包常见异常及处理方案:

异常类型触发场景处理方案
valueerror1. 格式字符串与时间字符串不匹配2. 无效时间戳3. 休眠时间为负数1. 严格校验格式匹配2. 检查时间戳范围3. 休眠前过滤负数
oserrortzset() 调用失败(如无效时区)捕获异常并回退到默认时区
typeerror传入非数值类型到 sleep()/time()类型校验,转换为浮点数
# 健壮的时间解析函数
def safe_strptime(time_str, format_str, default=none):
    """
    安全的时间解析函数,捕获异常并返回默认值
    :param time_str: 时间字符串
    :param format_str: 格式字符串
    :param default: 解析失败时的默认值
    :return: struct_time 或 default
    """
    try:
        return time.strptime(time_str, format_str)
    except valueerror as e:
        print(f"时间解析失败:{e},使用默认值")
        return default
    except typeerror as e:
        print(f"参数类型错误:{e},使用默认值")
        return default

# 测试异常场景
# 1. 格式不匹配
invalid_format = safe_strptime("2026-03-03", "%y/%m/%d", time.localtime())
print("格式不匹配时的默认值:", time.strftime("%y-%m-%d", invalid_format))

# 2. 无效时间戳
try:
    time.localtime(1e30)  # 超出范围的时间戳
except valueerror as e:
    print(f"无效时间戳:{e}")
    # 回退到当前时间
    st = time.localtime()
    print("回退到当前时间:", time.strftime("%y-%m-%d", st))

# 3. 安全休眠
def safe_sleep(seconds):
    if not isinstance(seconds, (int, float)):
        raise typeerror("休眠时间必须是数值类型")
    if seconds < 0:
        raise valueerror("休眠时间不能为负数")
    time.sleep(seconds)

# 测试安全休眠
try:
    safe_sleep(-1)
except valueerror as e:
    print(f"休眠异常:{e}")

六、实战进阶:time包的工业级应用

案例 1:高精度性能测试框架

import time
import statistics

class performancetester:
    """
    基于time包的高精度性能测试框架
    """
    def __init__(self, func, warmup=100, runs=1000):
        """
        :param func: 要测试的函数
        :param warmup: 预热次数(避免冷启动影响)
        :param runs: 测试次数
        """
        self.func = func
        self.warmup = warmup
        self.runs = runs
        self.timings = []

    def run(self, *args, **kwargs):
        """执行性能测试"""
        # 预热
        for _ in range(self.warmup):
            self.func(*args, **kwargs)
        
        # 正式测试(纳秒级计时)
        for _ in range(self.runs):
            start = time.perf_counter_ns()
            self.func(*args, **kwargs)
            end = time.perf_counter_ns()
            self.timings.append(end - start)
        
        # 计算统计结果
        return {
            "mean": statistics.mean(self.timings) / 1e6,  # 平均耗时(毫秒)
            "median": statistics.median(self.timings) / 1e6,  # 中位数(毫秒)
            "min": min(self.timings) / 1e6,  # 最小耗时(毫秒)
            "max": max(self.timings) / 1e6,  # 最大耗时(毫秒)
            "std": statistics.stdev(self.timings) / 1e6  # 标准差(毫秒)
        }

# 测试示例:排序函数性能
def test_func():
    lst = [i for i in range(1000)]
    lst.sort()

# 初始化测试器(预热100次,测试1000次)
tester = performancetester(test_func, warmup=100, runs=1000)
# 执行测试
results = tester.run()
# 输出结果
print("性能测试结果(毫秒):")
for key, value in results.items():
    print(f"  {key}: {value:.6f}")

案例 2:分布式系统时间同步校验

import time
import requests

def check_time_sync(ntp_server="pool.ntp.org", timeout=5):
    """
    校验本地时间与ntp服务器的同步性
    :param ntp_server: ntp服务器地址
    :param timeout: 超时时间
    :return: 时间差(秒),正数表示本地时间快,负数表示慢
    """
    try:
        # 从ntp服务器获取utc时间(简化版,实际需用ntplib库)
        # 此处用http api模拟
        response = requests.get(f"http://{ntp_server}/time", timeout=timeout)
        ntp_utc_ts = float(response.text)
        # 本地utc时间戳
        local_utc_ts = time.time() + time.timezone  # 本地时间戳 - 时区差 = utc时间戳
        # 计算时间差
        time_diff = local_utc_ts - ntp_utc_ts
        print(f"本地utc时间戳:{local_utc_ts:.6f}")
        print(f"ntp utc时间戳:{ntp_utc_ts:.6f}")
        print(f"时间差:{time_diff:.6f} 秒")
        return time_diff
    except exception as e:
        print(f"时间同步校验失败:{e}")
        return none

# 测试时间同步(需替换为真实ntp api)
# check_time_sync()

总结

  1. 核心认知time 包是操作系统 c 时间接口的 python 封装,跨平台差异主要体现在时区函数、时间戳范围和时钟精度,需针对性兼容。
  2. api 选型
    • 时间戳 / 结构化时间转换:time()/localtime()/gmtime()/mktime()
    • 高精度计时:优先用 perf_counter_ns()/monotonic_ns()(避免浮点误差);
    • 格式化 / 解析:掌握全量占位符,优先用 %z 而非 %z 处理时区;
    • 休眠:分段休眠避免长时间阻塞,windows 需补偿休眠精度。
  3. 工业级实践
    • 性能测试:预热 + 多次测试 + 统计分析,用纳秒级函数避免精度损失;
    • 跨平台兼容:避免使用 tzset(),用 utc 时间戳统一存储时间;
    • 异常处理:严格校验参数类型和范围,捕获格式化 / 解析异常。
  4. 进阶替代time 包适合基础时间操作,复杂场景(日期运算、时区转换)建议结合 datetime + zoneinfo(python 3.9+),功能更全面且跨平台兼容性更好。

到此这篇关于python time包精讲及异常处理的文章就介绍到这了,更多相关python time包内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

Python异步IO之asyncio举例深度解析

08-07

Python difflib库实现文本差异比较与合并实战指南

08-07

Python+PyQt6实现跨平台串口设备热插拔检测

08-07

Python+PyQt6实现将PDF文件转高清图片

08-07

Python基础入门之模块搜索路径sys.path用法详解

08-07

Python结合PyQt6实现屏幕截图工具(附源码)

08-07

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论