Python time模块详解:核心函数、struct_time类与时间格式化

小鹿同学
小鹿同学
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python标准库time模块,涵盖time.struct_time类的9个属性含义、常用时间转换函数(如asctime、ctime、localtime)及性能计时工具(perf_counter、process_time)。重点讲解strftime与strptime函数的格式指令对照表,并补充UTC、DST及平台差异等底层机制说明,帮助开发者掌握精确的时间处理技巧。

time模块概述与属性查看

time模块提供了丰富的日期和时间处理功能,包含多种类和函数。它支持将日期和时间格式化为字符串,同时也具备从字符串还原日期和时间的能力。

在Python交互式解释器中,首先导入time模块,随后执行命令 [e for e in dir(time) if not e.startswith('_')],即可列出该模块包含的所有属性和函数。


>>> [e for e in dir(time) if not e.startswith('_')]
['altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 
'monotonic',
 'perf_counter', 'process_time', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname']

time.struct_time类详解

time模块内置了time.struct_time类,用于表示时间对象。该对象包含9个属性,具体含义如下表所示:

表 1 time.struct_time 类中各属性的含义

表 1 time.struct_time 类中各属性的含义
字段名 字段含义 值
tm_year 年 如 2017、2018 等
tm_mon 月 如 2、3 等,范围为 1~12
tm_mday 日 如 2、3 等,范围为 1~31
tm_hour 时 如 2、3 等,范围为 0~23
tm_min 分 如 2、3 等,范围为 0~59
tm_sec  秒 如 2、3 等,范围为 0~59
tm_wday 周 周一为 0,范围为 0~6
tm_yday  一年内第几天 如 65,范围 1~366
tm_isdst 夏时令 0、1 或 -1

例如,Python可通过time.struct_time(tm_year=2018, tm_mon=5, tm_mday=2, tm_hour=8, tm_min=0, tm_sec=30, tm_wday=3, tm_yday=1, tm_isdst=0)清晰表示特定时间。

此外,Python也支持使用包含9个元素的元组来表示时间,这9个元素与struct_time对象的9个属性一一对应。例如,程序可以使用(2018, 5, 2, 8, 0, 30, 3, 1, 0)来代表时间。

time模块常用功能函数

time模块中常用的功能函数包括以下内容:

time.asctime([t]):将时间元组或struct_time对象转换为时间字符串。若未指定参数t,则默认转换当前时间。

time.ctime([secs]):将以秒数表示的时间转换为时间字符串。

time.gmtime([secs]):将以秒数表示的时间转换为struct_time对象。若未传入参数,则使用当前时间。

time.localtime([secs]):将以秒数表示的时间转换为表示当前时间的struct_time对象。若未传入参数,则使用当前时间。

time.mktime(t):作为localtime的反向函数,用于将struct_time对象或元组表示的时间转换为自1970年1月1日0点整以来经过的秒数。

time.perf_counter():返回性能计数器的值,单位为秒。

time.process_time():返回当前进程使用的CPU时间,单位为秒。

time.sleep(secs):暂停执行secs秒,期间不执行其他操作。

time.strftime(format[, t]):将时间元组或struct_time对象格式化为指定格式的时间字符串。若未指定参数t,则默认转换当前时间。

time.strptime(string[, format]):将字符串格式的时间解析为struct_time对象。

time.time():返回自1970年1月1日0点整以来经过的秒数。

time.timezone:返回本地时区的时间偏移量,单位为秒。

time.tzname:返回本地时区的名称。

以下程序演示了time模块中功能函数的具体用法:


import time
# 将当前时间转换为时间字符串
print(time.asctime())
# 将指定时间转换时间字符串,时间元组的后面3个元素没有设置
print(time.asctime((2018, 2, 4, 11, 8, 23, 0, 0 ,0))) # Mon Feb 4 11:08:23 2018
# 将以秒数为代表的时间转换为时间字符串
print(time.ctime(30)) # Thu Jan 1 08:00:30 1970
# 将以秒数为代表的时间转换为struct_time对象。
print(time.gmtime(30))
# 将当前时间转换为struct_time对象。
print(time.gmtime())
# 将以秒数为代表的时间转换为代表当前时间的struct_time对象
print(time.localtime(30))
# 将元组格式的时间转换为秒数代表的时间
print(time.mktime((2018, 2, 4, 11, 8, 23, 0, 0 ,0))) # 1517713703.0
# 返回性能计数器的值
print(time.perf_counter())
# 返回当前进程使用CPU的时间
print(time.process_time())
#time.sleep(10)
# 将当前时间转换为指定格式的字符串
print(time.strftime('%Y-%m-%d %H:%M:%S'))
st = '2018年3月20日'
# 将指定时间字符串恢复成struct_time对象。
print(time.strptime(st, '%Y年%m月%d日'))
# 返回从1970年1970年1月1日0点整到现在过了多少秒。
print(time.time())
# 返回本地时区的时间偏移,以秒为单位
print(time.timezone) # 在国内东八区输出-28800

运行上述程序,可获得如下输出结果:


Fri Feb 22 11:28:39 2019
Mon Feb 4 11:08:23 2018
Thu Jan 1 08:00:30 1970
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=30, tm_wday=3, tm_yday=1, 
tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=2, tm_mday=22, tm_hour=3, tm_min=28, tm_sec=39, tm_wday=4, tm_yday=53, 
tm_isdst=0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=30, tm_wday=3, tm_yday=1, 
tm_isdst=0)
1517713703.0
0.0
0.140625
2019-02-22 11:28:39
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=20, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=79, 
tm_isdst=-1)
1550806119.4960592
-28800

时间格式化指令对照表

time模块中的strftime()和strptime()互为逆函数。strftime()用于将struct_time对象或时间元组转换为时间字符串;strptime()则用于将时间字符串转换为struct_time对象。两者均涉及格式模板的编写,例如上述程序中%Y代表年、%m代表月、%d代表日、%H代表时、%M代表分、%S代表秒。这两个函数支持的时间格式字符串指令如下表所示:

指
令

含义
%a 本地化的星期几的缩写名,比如 Sun 代表星期天
%A 本地化的星期几的完整名
%b 本地化的月份的缩写名,比如 Jan 代表一月
%B 本地化的月份的完整名
%c 本地化的日期和时间的表示形式
%d 代表一个月中第几天的数值,范固: 01~31
%H 代表 24 小时制的小时,范围:00~23
%I 代表 12 小时制的小时,范围:01~12
%j 一年中第几天,范围:001~366
%m 代表月份的数值,范围:01~12
%M 代表分钟的数值,范围:00~59
%p 上午或下午的本地化方式。当使用 strptime() 函数并使用 %I 指令解析小时时,%p 只影响小时字段
%S 代表分钟的数值,范围:00~61。该范围确实是 00~61,60 在表示闰秒的时间戳时有效,而 61 则是由于一些历史原因造成的
%U 代表一年中表示第几周,以星期天为每周的第一天,范围:00~53。在这种方式下,一年中第一个星期天被认为处于第一周 。当使用 strptime() 函数解析时间字符串时,只有同时指定了星期几和年份该指令才会有效
%w 代表星期几的数值,范围:0~6,其中 0 代表周日
%W 代表一年小第几周,以星期一为每周的第一天,范围:00~53。在这种方式下,一年中第一个星期一被认为处于第一周 。当使用 strptime() 函数解析时间字符串时,只有同时指定了星期几和年份该指令才会有效
%x 本地化的日期的表示形式
%X 本地化的时间的表示形式
%y 年份的缩写,范围:00~99,比如 2018 年就简写成 18
%Y 年份的完整形式。如 2018
%z 显示时区偏移
%Z 时区名(如果时区不行在,则显示为空)
%% 用于代表%符号

底层机制与平台差异说明

知识点扩展:

time模块

该模块提供各种与时间相关的函数。相关功能可参考datetime和calendar模块。

并非所有平台都提供该模块的所有功能,具体支持情况因平台而异。

以下是对部分术语和惯例的解释:

  • 初始时间因平台而异。对于Unix平台,初始时间为1970,01,01,00:00:00(UTC)。查看每个操作平台的初始时间可使用time.gmtime(0)函数。
  • 在所有POSIX平台上,从初始时间以来的秒数均不包括闰秒。
  • 该模块中的函数可能无法处理初始时间之前和遥远未来的日期和时间。对于32位操作系统,未来的分界点为2038年。
  • UTC是协调世界时(以前称为格林尼治标准时间,GMT)。缩写UTC并非错误,而是英语和法语之间的妥协结果。
  • DST是夏令时,在一年中的某些时段,时区通常会调整一个小时。DST规则由当地法律决定,每年可能发生变化。
  • 各种实时函数的精度可能低于表示其值或参数所建议的精度。

以上就是Python time模块的详细内容,更多Python time模块详解资料请关注本站其他相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。