首发于 数据分析

Python内置库:time

time模块包含用于获取当前时间 、操作时间和日期、从字符串中读取日期、将日期格式化为字符串函数。日期可以表示为自从 1970 年 1 月 1 日午夜(历元)经过了秒的一个实数,也可以表示为包含9个整数的元组。

一、时间戳与时间元组

1.1 时间戳

import time
a_sn=time.time()
print("当前时间戳为:", a_sn)
print(type(a_sn))
当前时间戳为: 1650422228.1764307
<class 'float'>

上面这个案例演示了用 time() 获取当前的时间戳。

1.2 时间元组

很多Python函数用一个元组装起来的9组数字处理时间:

索引 属性 字段
0 tm_year 如2000,2022等
1 tm_mon 范围1~12
2 tm_mday 范围1~31
3 tm_hour 小时 范围0~23
4 tm_min 分钟 范围0~59
5 tm_sec 0~61 (60~61 是闰秒)
6 tm_wday 星期 范围0~6 (0表示周一)
7 tm_yday 第N日 1到366
8 tm_isdst 夏令时 0、1或-1
N/A tm_zone 时区 0、1或-1
N/A tm_gmtoff UTC东偏 以秒为单位

秒的取值范围为0~61,考虑到闰一秒或闰两秒的情形。夏令时数字是布尔值,如果使用-1,表示未知的,那么使用mktime()可能得到正确的值。

import time
b_sn=time.gmtime()
print(b_sn)
print(type(b_sn))
b_sn=time.gmtime(time.time())
print(b_sn)
print(type(b_sn))
c_sn=time.localtime()
print(c_sn)
print(type(c_sn))
c_sn=time.localtime(time.time())
print(c_sn)
print(type(c_sn))
time.struct_time(tm_year=2022, tm_mon=4, tm_mday=20, tm_hour=2, tm_min=48, tm_sec=57, tm_wday=2, tm_yday=110, tm_isdst=0)
<class 'time.struct_time'>
time.struct_time(tm_year=2022, tm_mon=4, tm_mday=20, tm_hour=2, tm_min=48, tm_sec=57, tm_wday=2, tm_yday=110, tm_isdst=0)
<class 'time.struct_time'>
time.struct_time(tm_year=2022, tm_mon=4, tm_mday=20, tm_hour=10, tm_min=48, tm_sec=57, tm_wday=2, tm_yday=110, tm_isdst=0)
<class 'time.struct_time'>
time.struct_time(tm_year=2022, tm_mon=4, tm_mday=20, tm_hour=10, tm_min=48, tm_sec=57, tm_wday=2, tm_yday=110, tm_isdst=0)
<class 'time.struct_time'>

上面这个案例演示了获取当前时间的时间元组。

localtime()的缺省值为time()返回的当前时间戳。

或:

import time
e_sn='03-12-21 23:23:23'
f_sn='98-09-08 12:13:14'
print(time.strptime(e_sn,'%y-%m-%d %H:%M:%S'))
print(time.strptime(f_sn,'%y-%m-%d %H:%M:%S'))
time.struct_time(tm_year=2003, tm_mon=12, tm_mday=21, tm_hour=23, tm_min=23, tm_sec=23, tm_wday=6, tm_yday=355, tm_isdst=-1)
time.struct_time(tm_year=1998, tm_mon=9, tm_mday=8, tm_hour=12, tm_min=13, tm_sec=14, tm_wday=1, tm_yday=251, tm_isdst=-1)


1.3 时间字符串

import time
d_sn=time.ctime()
e_sn=time.asctime(time.localtime())
print(d_sn)
print(e_sn)
print(type(d_sn))
print(type(e_sn))
Wed Apr 20 11:25:40 2022
Wed Apr 20 11:25:40 2022
<class 'str'>
<class 'str'>

此处也可直接使用asctime(),因为asctime()的缺省值为localtime()返回的当前时间。

亦可使用 ctime() , ctime() 等价于 asctime(localtime())。

二、时间格式化

使用 time 模块的strftime 方法来格式化日期:time.strftime(format[, t]),第一个参数是格式化字符串,第二个参数是时间元组。

import time
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
print(time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))
2022-04-20 11:29:42
Wed Apr 20 11:29:42 2022

上面的案例演示了将本地时间进行格式化输出。

指令 含意 备注
%a 本地化的缩写星期中每日的名称。
%A 本地化的星期中每日的完整名称。
%b 本地化的月缩写名称。
%B 本地化的月完整名称。
%c 本地化的适当日期和时间表示
%d 十进制数 [01,31] 表示的月中日
%H 十进制数 [00,23] 表示的小时(24小时制)
%I 十进制数 [01,12] 表示的小时(12小时制)
%j 十进制数 [001,366] 表示的年中日
%m 十进制数 [01,12] 表示的月
%M 十进制数 [00,59] 表示的分钟
%p 本地化的 AM 或 PM (1)
%S 十进制数 [00,61] 表示的秒 (2)
%U 十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)。 在第一个星期日之前的新年中的所有日子都被认为是在第 0 周 (3)
%w 十进制数 [0(星期日),6] 表示的周中日
%W 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)。 在第一个星期一之前的新年中的所有日子被认为是在第 0 周 (3)
%x 本地化的适当日期表示
%X 本地化的适当时间表示
%y 十进制数 [00,99] 表示的没有世纪的年份
%Y 十进制数表示的带世纪的年份
%z 十进制带符号数[-1200,+1200]表示时区
%Z 时区名称
%% 字面的 ‘%’ 字符

注释:

  • 当与 strptime() 函数一起使用时,如果使用 %I 指令来解析小时, %p 指令只影响输出小时字段。
  • 范围真的是 0 到 61 ;值 60 在表示 leap seconds 的时间戳中有效,并且由于历史原因支持值 61 。
  • 当与 strptime() 函数一起使用时, %U 和 %W 仅用于指定星期几和年份的计算。
from time import gmtime, strftime
print(strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()))
Wed, 20 Apr 2022 03:38:55 +0000

三、函数

函数 描述
asctime([t]) 将时间元组转换为字符串
ctime([secs]) 将秒转换为字符串
localtime([secs]) 将秒转换为当地时间的时间元组
gmtime([secs]) 将秒转换为UTC时间的时间元组
mktime(t) 将时间元组转换为当地时间
sleep(secs) 休眠secs秒
strftime(format[, t]) 将时间元组换为字符串
strptime(t[, format]) 将字符串转换为时间元组
time() 当前时间,自纪元以来的秒

四、术语及惯例

4.1 epoch 是时间开始的点, 其值取决于平台 。对于Unix, epoch 是1970年1月1日00:00:00(UTC)。要找出给定平台上的 epoch ,请查看

import time
print(time.gmtime(0))
结果(win):
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

4.2 纪元秒数 是指自 epoch (纪元)时间点以来经过的总秒数,通常不包括 闰秒。 在所有符合 POSIX 标准的平台上,闰秒都不会记录在总秒数中。

4.3 此模块中的函数可能无法处理纪元之前或遥远未来的日期和时间。“遥远未来”的定义由对应的C语言库决定;对于32位系统,它通常是指2038年及以后。

4.4 函数 strptime() 在接收到 %y 格式代码时可以解析使用 2 位数表示的年份。当解析 2 位数年份时,函数会按照 POSIX 和 ISO C 标准进行年份转换:数值 69--99 被映射为 1969--1999;数值 0--68 被映射为 2000--2068。

import time
e_sn='03-12-21 23:23:23'