一文读懂 Python 的 time 模块:时间处理全攻略

一文读懂 Python 的 time 模块:时间处理全攻略

在 Python 编程中,对时间的处理是一项常见且重要的任务。time模块作为 Python 标准库的一部分,提供了丰富的函数和工具,用于访问、转换和操作时间。本文将深入剖析time模块的各个方面,包括基本概念、常用函数、时间表示的转换、时钟类型、时区处理以及相关注意事项,帮助读者全面掌握time模块的使用,提升在时间处理相关编程场景中的能力。

一、time 模块基础概念

(一)epoch 与纪元秒数

epoch 是时间起始点,在所有平台上,time.gmtime(0)的返回值都是 1970-01-01 00:00:00 (UTC)。纪元秒数指从 epoch 开始经过的总秒数,通常不包含闰秒,在符合 POSIX 标准的平台上,闰秒不会被记录在总秒数中。

(二)时间表示与术语

  1. UTC 与 DST:UTC 即协调世界时,曾被称为格林威治标准时间(GMT)。DST 是夏令时,在一年中特定时段将当地时间调整(通常为一小时),其规则由当地法律确定,C 语言库通过表格(通常从系统文件读取)记录各地规则 。
  2. struct_time 对象gmtime()localtime()strptime()返回的时间值是一个包含 9 个整数的序列,以struct_time对象表示。该对象可通过索引和属性名访问各个时间字段,如tm_year(年份)、tm_mon(月份,范围是 [1, 12])等。

二、time 模块的常用函数

(一)时间转换函数

  1. gmtime([secs]):将自 epoch 开始的秒数转换为 UTC 时间的struct_time对象,若未传入secs,则使用当前时间。例如:
import time
utc_time = time.gmtime()
print(utc_time)
  1. localtime([secs]):与gmtime()类似,但转换为本地时间。当 DST 适用于给定时间时,dst标志设置为 1。若时间戳超出平台 C 函数支持范围,可能引发OverflowErrorOSError 。示例:
local_time = time.localtime()
print(local_time)
  1. mktime(t)localtime()的反函数,将struct_time对象或 9 元组(需包含dst标志,未知时用 - 1)表示的本地时间转换为自 epoch 开始的秒数(浮点数)。若输入值无效,会引发OverflowErrorValueError 。例如:
time_tuple = (2024, 10, 1, 12, 0, 0, 0, 0, -1)
seconds = time.mktime(time_tuple)
print(seconds)
  1. asctime([t]):将gmtime()localtime()返回的struct_time对象或相应元组转换为指定格式的字符串,如 ‘Sun Jun 20 23:21:05 1993’。若未提供t,则使用当前本地时间,且该函数不添加尾随换行符。示例:
time_str = time.asctime()
print(time_str)
  1. ctime([secs]):将距离 epoch 的秒数表示的时间转换为本地时间的字符串形式,等价于asctime(localtime(secs))。若未提供secs,则使用当前时间。示例:
ctime_str = time.ctime()
print(ctime_str)
函数名作用输入输出注意事项
gmtime([secs])将秒数转换为 UTC 时间的struct_time对象秒数(可选,默认当前时间)struct_time对象忽略一秒以内的小数
localtime([secs])将秒数转换为本地时间的struct_time对象秒数(可选,默认当前时间)struct_time对象可能引发OverflowErrorOSError
mktime(t)struct_time对象或 9 元组转换为秒数struct_time对象或 9 元组浮点数输入无效时引发异常
asctime([t])struct_time对象或元组转换为指定格式字符串struct_time对象或元组(可选,默认当前本地时间)字符串不添加尾随换行符
ctime([secs])将秒数转换为本地时间的字符串形式秒数(可选,默认当前时间)字符串等价于asctime(localtime(secs))

(二)时间格式化函数

  1. strftime(format [, t]):根据指定的format字符串,将gmtime()localtime()返回的时间(struct_time对象或元组)转换为字符串。format字符串中包含各种指令,用于指定输出格式。例如:
current_time = time.localtime()
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time)
print(formatted_time)
  1. strptime(string [, format]):根据format字符串解析表示时间的字符串,返回struct_time对象。format默认为匹配ctime()返回的格式。若字符串无法解析或有多余数据,会引发ValueError 。示例:
time_str = "2024-10-01 12:00:00"
parsed_time = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")
print(parsed_time)

(三)其他实用函数

  1. time():返回以浮点数表示的从 epoch 开始的秒数,即 Unix 时间。不同平台对闰秒的处理方式不同,且部分系统精度可能低于 1 秒,系统时钟设置可能导致返回值出现异常。示例:
seconds_since_epoch = time.time()
print(seconds_since_epoch)
  1. sleep(secs):使调用方线程暂停执行指定的秒数,secs可以是浮点数以指定更精确的休眠时间。在 Windows 和 Unix 系统上的实现方式有所不同,且睡眠过程可能受信号中断和系统活动影响。例如:
print("开始睡眠")
time.sleep(2)
print("睡眠结束")
  1. tzset():重置库例程使用的时间转换规则,通过设置环境变量TZ来指定转换方式。该函数还会设置tznametimezonealtzonedaylight等变量 。示例:
import os
os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'
time.tzset()

三、时钟类型与相关函数

(一)单调时钟

  1. monotonic():返回一个单调时钟的值,该时钟不能倒退且不受系统时钟更新影响,只有两次调用之间的差值有效。可使用monotonic_ns()避免float类型导致的精度损失。示例:
start = time.monotonic()
# 执行一些操作
end = time.monotonic()
duration = end - start
print(f"操作耗时: {duration} 秒")
  1. monotonic_ns():与monotonic()类似,但返回时间为纳秒数。

(二)性能计数器

  1. perf_counter():返回用于测量较短持续时间的高性能计数器的值,包括睡眠状态消耗的时间,作用于全系统范围,两次调用差值有效。可使用perf_counter_ns()避免精度损失。例如:
start = time.perf_counter()
# 执行一些操作
end = time.perf_counter()
duration = end - start
print(f"操作耗时: {duration} 秒")
  1. perf_counter_ns():返回纳秒时间。

(三)进程和线程时间

  1. process_time():返回当前进程的系统和用户 CPU 时间总计值,不包括睡眠状态消耗时间,仅作用于进程范围,两次调用差值有效。可使用process_time_ns()避免精度损失。示例:
start = time.process_time()
# 执行一些进程相关操作
end = time.process_time()
duration = end - start
print(f"进程操作耗时: {duration} 秒")
  1. process_time_ns():返回纳秒时间。
  2. thread_time():返回当前线程的系统和用户 CPU 时间总计值,不包括睡眠状态消耗时间,仅作用于线程范围,可使用thread_time_ns()避免精度损失。示例:
import threading

def thread_function():
    start = time.thread_time()
    # 线程执行一些操作
    end = time.thread_time()
    duration = end - start
    print(f"线程操作耗时: {duration} 秒")

thread = threading.Thread(target=thread_function)
thread.start()
thread.join()
  1. thread_time_ns():返回纳秒时间。
时钟类型函数名作用精度适用场景
单调时钟monotonic()返回单调时钟值(秒)秒(float类型,可通过monotonic_ns()提高精度)测量相对时间间隔,不受系统时钟调整影响
monotonic_ns()返回单调时钟值(纳秒)纳秒高精度测量相对时间间隔
性能计数器perf_counter()返回高性能计数器值(秒),包含睡眠时间秒(float类型,可通过perf_counter_ns()提高精度)精确测量短时间操作的耗时
perf_counter_ns()返回高性能计数器值(纳秒)纳秒高精度测量短时间操作的耗时
进程时间process_time()返回当前进程 CPU 时间总计值(秒),不包含睡眠时间秒(float类型,可通过process_time_ns()提高精度)测量进程 CPU 使用时间
process_time_ns()返回当前进程 CPU 时间总计值(纳秒)纳秒高精度测量进程 CPU 使用时间
线程时间thread_time()返回当前线程 CPU 时间总计值(秒),不包含睡眠时间秒(float类型,可通过thread_time_ns()提高精度)测量线程 CPU 使用时间
thread_time_ns()返回当前线程 CPU 时间总计值(纳秒)纳秒高精度测量线程 CPU 使用时间

四、时区处理

(一)时区常量

time模块提供了altzonedaylighttimezonetzname等常量用于处理时区相关信息。但这些常量的值由模块加载或tzset()最后一次调用时生效的时区规则确定,对于过去时间可能不准确,建议使用localtime()结果中的tm_gmtofftm_zone获取时区信息。

(二)设置时区

通过设置环境变量TZ并调用tzset()函数,可以重置时间转换规则。TZ环境变量有特定的格式,不同系统还可通过设置TZ为系统 ‘zoneinfo’ 时区数据库路径来指定时区规则 。

五、注意事项与局限性

  1. 平台差异time模块的函数在不同平台上的行为和可用性可能不同,部分函数仅在特定操作系统上可用,使用时需查阅对应平台文档。
  2. 精度问题:受系统限制,部分函数的精度可能无法达到预期,如在某些 Unix 系统上,时钟频率较低。使用time()sleep()时,虽然它们在 Python 中精度有所提升,但仍可能受系统活动影响。
  3. 时间范围限制:模块中的函数可能无法处理 epoch 之前或遥远未来的日期和时间,对于 32 位系统,“遥远未来” 通常指 2038 年之后。

总结

time模块是 Python 处理时间的重要工具,涵盖了时间获取、转换、格式化以及时钟测量等多种功能。通过理解 epoch、UTC、DST 等基本概念,掌握常用函数的使用方法,以及注意不同时钟类型的特点和时区处理方式,开发者能够在编程中灵活处理各种时间相关需求。但在使用过程中,要充分考虑平台差异、精度问题和时间范围限制,确保程序的正确性和稳定性。

TAG:Python、time 模块、时间处理、时间转换、时区、时钟类型

相关学习资源

  1. Python 官方文档(https://docs.python.org/zh-cn/3.12/library/time.html):提供了time模块最权威和详细的说明,包括函数定义、参数、返回值以及示例代码等,是深入学习time模块的基础资源。
  2. Tekin的Python编程秘籍库Python 实用知识与技巧分享,涵盖基础、爬虫、数据分析等干货 本 Python 专栏聚焦实用知识,深入剖析基础语法、数据结构。分享爬虫、数据分析等热门领域实战技巧,辅以代码示例。无论新手入门还是进阶提升,都能在此收获满满干货,快速掌握 Python 编程精髓。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tekin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值