时间模块与日历模块
在 Python 中是没有原生数据类型支持时间的,日期与时间的操作需要借助是三个模块,分别是 time、datetime、calendar。
一、介绍:
1. time 模块可以操作 C 语言库中的时间相关函数,时钟时间与处理器运行时间都可以获取。
2. datetime 模块提供了日期与时间的高级接口。
3. calendar 模块为通用日历相关函数,用于创建数周、数月、数年的周期性事件。
二、补充信息:
1. epoch(纪元):时间开始的点,其值取决于平台。如:
import time
print(time.gmtime(0))
# 输出结果:
#
# 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)
2. 纪元秒数:是指 epoch 时间点以来经历过的总秒数,通常不包括闰秒。在所有符合 POSIX 标准的平台上,闰秒都不会记录在总秒数中。通常,将纪元秒数称为时间数。
三、get_clock_info 函数:该函数获取时钟的基本信息,得到的值因不同系统而存在差异。
1. 语法格式:
time.get_clock_info(name)
2. name 取值:
(1) monotonic:time.monotonic()
(2) perf_counter:time.perf_counter()
(3) process_time:time.process_time()
(4) thread_time:time.thread_time()
(5) time:time.time()
3. 该函数返回值的属性:
(1) adjustable:如果时钟可以自动更改(例如通过 NTP 守护程序)或由系统管理员手动更改,则为 True,否则为 False。
(2) implementation:用于获取时钟值的基础 C 函数名称,即调用底层 C 的函数。
(3) monotonic:如果时钟不能倒退则为 True,否则为 False。
(4) resolution:以秒为单位的时钟分辨率(float)。
四、获取时间戳 time.time() 函数:
在 Python 中通过 time.time() 函数获取纪元秒数,可以把从 epoch 开始之后的秒数以浮点数格式返回:
import time
print(time.time())
# 输出结果:
#
# 1675911916.7722962
五、获取可读时间 time.ctime() 函数:
1. 时间戳主要用于时间上的方便计算,比较难理解,若希望获得可读时间,使用 ctime() 函数。如:
import time
print(time.ctime())
# 输出结果:
#
# Thu Feb 9 11:09:27 2023
2. 直接将时间戳转换为可读时间,使用 localtime 函数。如:
import time
localtime = time.localtime(time.time())
print("本地时间为 :", localtime)
# 输出结果:
#
# 本地时间为 : time.struct_time(tm_year=2023, tm_mon=2, tm_mday=9, tm_hour=11, tm_min=55, tm_sec=3, tm_wday=3, tm_yday=40, tm_isdst=0)
· 时间戳最小为 0,最大值由 Python 的环境和操作系统决定。
六、单调时间 time.monotonic() 函数:
从系统启动开始计时,一般从 0 开始单调递增。操作系统的时间也可能不是从 0 开始,而且会因为时间出错而回调。如:
import time
print("单调时间:",time.monotonic())
# 输出结果:
#
# 单调时间: 53431.453
七、处理器时钟时间 time.clock() 函数:
1. time() 函数返回的是纪元秒数(时间戳),clock() 函数返回的是处理器时钟时间。
2. clock() 函数的返回值:
(1) 第一次调用时,返回的是程序运行的实际时间。
(2) 第二次及之后的调用,返回的是自第一次调用后到这次调用的时间间隔。
· Python3.8 已移除 clock() 函数,用time.perf_counter() 或 time.process_time() 方法代替。
八、性能计数器 time.perf_counter() 函数:
该函数的 epoch 是未定义的,一般使用该函数是为了比较和计算,不是为了用作绝对时间。该时钟用于测量较短持续时间的具有最高有效精度的时钟,包括睡眠状态消耗的时间,调用两次才会有效。如:
import time
t0 = time.perf_counter()
for i in range(100000):
pass
print("程序运行时间: ", time.perf_counter() - t0)
# 输出结果:
#
# 程序运行时间: 0.050107000000000124
· 与其类似的函数还有 perf_counter_ns()、process_time()、process_time_ns()。
九、时间组件:
1. gmtime():返回 UTC 中的当前时间。
2. localtime():返回当前时区对应的时间。
3. mktime():接收 struct_time 类型数据并将其转换成浮点型数值,即时间戳。
十、解析和格式化时间:
strptime() 和 strftime() 函数可以使时间值在 struct_time 表示和字符串表示之间互相转换。如:
import time
x = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(x)
struct_time = time.strptime(x, "%Y-%m-%d %H:%M:%S")
print(struct_time)
# 输出结果:
#
# 2023-02-09 22:28:49
# time.struct_time(tm_year=2023, tm_mon=2, tm_mday=9, tm_hour=22, tm_min=28, tm_sec=49, tm_wday=3, tm_yday=40, tm_isdst=-1)
· tm_sec 秒数,取值 0-61;tm_wday 星期,取值 0-6,其中零表示星期日;tm_isdst 在夏令时生效时为 1,不生效时为 0,-1 表示未知。
· 官方参数:
十一、datetime 模块:
在 datetime 模块中,Python 提供了五个主要的对象类:
datetime:允许同时操作时间和日期;
date:只操作日期;
time:只操作时间;
timedelta:用于操作日期以及测量时间跨度;
tzinfo:处理时区。
1. datetime 类:是 date 类与 time 类的结合体。
(1) 获取当前的日期与时间:
from datetime import datetime
dt = datetime.now()
print(dt)
# 输出结果:
#
# 2023-02-09 22:40:40.947211
(2) 获取时间戳:
from datetime import datetime
dt = datetime.now()
stamp = datetime.timestamp(dt)
print(stamp)
# 输出结果:
#
# 1675953750.07976
2. date 类:
(1) 类的属性和方法:
· min、max:date 对象能表示的最小、最大日期。
· resolution:date 对象表示日期的最小单位,返回“天”。
· today():返回表示当前本地日期的 date 对象。
· fromtimestamp(timestamp):根据时间戳,返回一个 date 对象。
import time
from datetime import date
print('date.min:', date.min)
print('date.max:', date.max)
print('date.resolution:', date.resolution)
print('date.today():', date.today())
print('date.fromtimestamp():', date.fromtimestamp(time.time()))
# 输出结果:
#
# date.min: 0001-01-01
# date.max: 9999-12-31
# date.resolution: 1 day, 0:00:00
# date.today(): 2023-02-09
# date.fromtimestamp(): 2023-02-09
(2) 对象的属性和方法:
创建一个 date 对象:
from datetime import date
d = date(year=2021,month=3,day=9)
print(d)
# 输出结果:
#
# 2021-03-09
· d.year:返回“年”;
· d.month:返回“月”;
· d.day:返回“日”;
· d.weekday():返回“星期”,如果是星期一则返回 0,如果是星期二则返回 1,以此类推;
· d.isoweekday():返回“星期”,如果是星期一则返回 1,如果是星期二则返回 2,以此类推;
· d.isocalendar():返回格式如 (year, month, day);
· d.isoformat():返回格式如 “YYYY-MM-DD” 的字符串格式;
· d.strftime(fmt):自定义格式化字符串,与 time 模块中的strftime 类似。
3. time 类:
(1) 类的属性:
· min、max:time 类所能表示的最小、最大时间。
其中,time.min = time(0, 0, 0, 0),time.max = time(23, 59, 59, 999999)。
· resolution:时间的最小单位,此处为 1 微妙。
from datetime import time
print('time.min:', time.min)
print('time.max:', time.max)
print('time.resolution:', time.resolution)
# 输出结果:
#
# time.min: 00:00:00
# time.max: 23:59:59.999999
# time.resolution: 0:00:00.000001
(2) 对象的属性和方法:
创建一个 time 对象:
from datetime import time
t = time(hour=20, minute=20, second=40)
print(t)
# 输出结果:
#
# 20:20:40
· t.hour、t.minute、t.second、t.microsecond:时、分、秒、微秒;
· t.tzinfo:时区信息;
· t.isoformat():返回型如“HH:MM:SS”格式的字符串表示时间;
· t.strftime(fmt):返回自定义格式化字符串。
4. timedelta 类:
通过 timedelta() 函数返回一个 timedelta 时间间隔对象,该函数无必填参数,若写入一个参数则表示间隔多少天。如:
from datetime import timedelta
print(timedelta(10)) # 间隔 10 天
print(timedelta(weeks=1)) # 跨度为1 周
# 输出结果:
#
# 10 days, 0:00:00
# 7 days, 0:00:00
· 两个时间间隔对象可以彼此之间相加减,返回的仍是一个时间间隔对象。
· 一个 datetime 对象减去一个时间间隔对象,返回的是一个 datetime 对象。
· 两个 datetime 对象相减,返回的是一个时间间隔对象。
十二、calendar 模块:
calendar 模块定义了 Calendar 类,该类封装了值的计算,例如给定月份或年份中周的日期。通过 TextCalendar 和 HTMLCalendar 类可以生成预格式化的输出。
如:默认从周日开始:
import calendar
c = calendar.TextCalendar(calendar.SUNDAY)
c.prmonth(2021, 3)
# 输出结果:
#
# March 2021
# Su Mo Tu We Th Fr Sa
# 1 2 3 4 5 6
# 7 8 9 10 11 12 13
# 14 15 16 17 18 19 20
# 21 22 23 24 25 26 27
# 28 29 30 31