Python内置模块time: 时间的访问和转换详解

一、引言

在Python编程中,处理时间是一个常见的需求。无论是记录程序运行时间、定时任务、还是处理日期和时间数据,Python都提供了强大的内置模块time来满足这些需求。

二、知识导图

三、时间表示

1. 纪元时间(Epoch Time)

  • 定义:纪元时间是指从1970年1月1日00:00:00(UTC)开始到当前时间所经过的秒数,不包括闰秒。
  • 原理:大多数计算机系统使用这个时间点作为时间的起点,称为“纪元”或“Unix时间戳”。

2. struct_time对象

  • 定义struct_time是一个包含9个元素的元组,表示时间的各个部分,如年、月、日、时、分、秒等。
  • 属性:包括tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst

四、时间转换函数

1. gmtime

  • 功能:将纪元时间转换为UTC时间的struct_time对象。
  • 原型time.gmtime([secs])
  • 参数secs - 纪元时间(秒),默认为当前时间。
  • 返回值:UTC时间的struct_time对象。
  • 示例
import time


gmt_time = time.gmtime()
print(gmt_time)

2. localtime

  • 功能:将纪元时间转换为本地时间的struct_time对象。
  • 原型time.localtime([secs])
  • 参数secs - 纪元时间(秒),默认为当前时间。
  • 返回值:本地时间的struct_time对象。
  • 示例
local_time = time.localtime()
print(local_time)

3. mktime

  • 功能:将本地时间的struct_time对象转换为纪元时间。
  • 原型time.mktime(t)
  • 参数t - 本地时间的struct_time对象。
  • 返回值:纪元时间(秒)。
  • 示例
local_time = time.localtime()
epoch_time = time.mktime(local_time)
print(epoch_time)

4. asctime

  • 功能:将struct_time对象或元组转换为可读的字符串格式。
  • 原型time.asctime([t])
  • 参数t - struct_time对象或元组,默认为当前本地时间。
  • 返回值:可读的时间字符串。
  • 示例
current_time = time.localtime()
readable_time = time.asctime(current_time)
print(readable_time)

5. ctime

  • 功能:将纪元时间转换为可读的字符串格式。
  • 原型time.ctime([secs])
  • 参数secs - 纪元时间(秒),默认为当前时间。
  • 返回值:可读的时间字符串。
  • 示例
readable_time = time.ctime()
print(readable_time)

6. strftime

  • 功能:将struct_time对象或元组格式化为自定义的字符串。
  • 原型time.strftime(format[, t])
  • 参数
  • format - 格式化字符串。
  • t - struct_time对象或元组,默认为当前本地时间。
  • 返回值:格式化后的时间字符串。
  • 格式化指令:如%Y(年份)、%m(月份)、%d(日)等。
  • 示例
local_time = time.localtime()
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", local_time)
print(formatted_time)

7. strptime

  • 功能:将字符串解析为struct_time对象。
  • 原型time.strptime(string[, format])
  • 参数
  • string - 时间字符串。
  • format - 格式化字符串,与strftime相同。
  • 返回值:解析后的struct_time对象。
  • 示例
time_string = "30 Nov 00"
parsed_time = time.strptime(time_string, "%d %b %y")
print(parsed_time)

五、时间获取函数

1. time

  • 功能:返回当前时间的纪元时间(浮点数,秒)。
  • 原型time.time()
  • 返回值:当前时间的纪元时间(秒)。
  • 示例
current_epoch_time = time.time()
print(current_epoch_time)

2. perf_counter

  • 功能:返回一个高精度的性能计数器,用于测量短时间间隔。
  • 原型time.perf_counter()
  • 返回值:当前性能计数器的值(秒)。
  • 示例
start = time.perf_counter()
# 执行一些操作
end = time.perf_counter()
elapsed_time = end - start
print(f"Elapsed time: {elapsed_time} seconds")

3. process_time

  • 功能:返回当前进程的CPU时间,不包括睡眠时间。
  • 原型time.process_time()
  • 返回值:当前进程的CPU时间(秒)。
  • 示例
cpu_time = time.process_time()
print(cpu_time)

4. thread_time

  • 功能:返回当前线程的CPU时间,不包括睡眠时间。
  • 原型time.thread_time()
  • 返回值:当前线程的CPU时间(秒)。
  • 示例
thread_cpu_time = time.thread_time()
print(thread_cpu_time)

六、时间操作函数

1. sleep

  • 功能:暂停当前线程的执行指定的秒数。
  • 原型time.sleep(secs)
  • 参数secs - 暂停的秒数,可以是浮点数。
  • 示例
print("Start sleeping")
time.sleep(2.5)  # 暂停2.5秒
print("Wake up")

七、应用示例

1. 计算代码执行时间

import time


def calculate_sum(n):
    total = 0
    for i in range(n):
        total += i
    return total


start_time = time.perf_counter()
result = calculate_sum(1000000)
end_time = time.perf_counter()


elapsed_time = end_time - start_time
print(f"Result: {result}, Elapsed time: {elapsed_time} seconds")

解析:通过perf_counter函数,我们可以精确地测量代码块的执行时间,这对于性能优化非常有用。

2. 格式化当前时间

import time


current_time = time.localtime()
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time)
print(f"Current time: {formatted_time}")

解析:使用strftime函数,可以将当前时间格式化为易读的字符串,适用于日志记录、用户界面显示等场景。

3. 解析时间字符串

import time


time_string = "2023-10-01 12:34:56"
parsed_time = time.strptime(time_string, "%Y-%m-%d %H:%M:%S")
print(parsed_time)

解析:通过strptime函数,可以将特定格式的时间字符串转换为struct_time对象,便于进一步处理和计算。

八、注意事项

  1. 平台差异time模块中的函数依赖于底层C库的实现,因此在不同平台上可能存在细微差异,特别是在处理时区和夏令时(DST)时。
  2. 精度问题:虽然time.time()返回浮点数以提高精度,但在某些系统上可能无法达到纳秒级精度。对于高精度需求,可以使用time.perf_counter()time.time_ns()
  3. 时区处理time模块本身对时区的支持有限,建议使用datetime模块结合pytz库来处理复杂的时区转换。
  4. 纪元时间限制:纪元时间通常不能处理1970年之前或2038年之后的日期(在32位系统上),需注意时间范围的限制。

九、学习路线

  1. 基础概念:理解纪元时间、struct_time对象及时间表示方法。
  2. 时间转换:掌握gmtime, localtime, mktime, asctime, ctime, strftime, strptime等函数的使用。
  3. 时间获取:学习time, perf_counter, process_time, thread_time等函数,了解如何获取不同类型的时间信息。
  4. 时间操作:熟悉sleep函数,掌握如何暂停程序执行。
  5. 应用实践:通过实际项目或练习,应用所学知识,如计算代码执行时间、格式化时间、解析时间字符串等。
  6. 扩展学习:进一步学习datetime模块,处理更复杂的日期和时间操作,以及使用第三方库如pytz进行时区管理。

附录:常用时间格式指令表

表1:常用时间格式指令

指令

含义

示例

%Y

四位数的年份

2023

%y

两位数的年份

23

%m

月份(01-12)

10

%d

日(01-31)

01

%H

小时(24小时制,00-23)

12

%I

小时(12小时制,01-12)

03

%M

分钟(00-59)

34

%S

秒(00-61)

56

%A

完整的星期名称

Monday

%a

缩写的星期名称

Mon

%B

完整的月份名称

October

%b

缩写的月份名称

Oct

%p

AM 或 PM

PM

%f

微秒(000000-999999)

123456

%z

UTC偏移量

+0800

%Z

时区名称

CST

%%

百分号字符

%

注意:部分格式指令如%f, %z, %Z在不同平台上的支持可能有所不同,使用时应参考具体平台的文档。


持续更新Python编程学习日志与技巧,敬请关注!


#编程# #学习# #python# #在头条记录我的2025#

原文链接:,转发请注明来源!