Python-时间模块
前言
时间信息是编程中怎么也绕不开的信息之一,Python中内置了时间处理的标准库time
、datetime
和calendar
,可以帮助我们快速地处理时间。
time模块
时间格式
主要分为时间戳(timestamp)、结构化时间(struct_time)和字符串时间(str format time)
1 | import time |
时间戳的取值是指输入时间距Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
struct_time
可以让我们很容易获得当前时间的格式化信息,包括年月日、时分秒、星期几(从0开始为星期一)以及是今年的第几天的具体数字
1 | struct_time = time.localtime() |
字符串格式是更加符合我们日常生活的格式,如2025年1月18日 15点33分
处理时间的关键就在于把握好上述三种格式的相互转化关系
相互转化
timestamp
和struct_time
的相互转化flowchart LR a[timestamp] -->|localtime| b[struct_time] b(struct_time) -->|mktime| a(timestamp)
1
2
3
4
5
6
7
8
9# 时间戳转化为struct_time
now = time.time()
print(time.localtime(now))
# time.struct_time(tm_year=2025, tm_mon=1, tm_mday=18, tm_hour=15, tm_min=55, tm_sec=56, tm_wday=5, tm_yday=18, tm_isdst=0)
# struct_time转化为时间戳
now2 = time.struct_time((2025, 1, 18, 15, 55, 6, 5, 18, 0))
print(time.mktime(now2)) # 1737186906.0字符串和
struct_time
的相互转化flowchart LR a(str format time) -->|strptime| b(struct_time) b(struct_time) -->|asctime or strftime| a(str format time)
1
2
3
4
5
6
7
8
9# str format time 转化为struct_time
now = "2025年1月18日 15点33分"
print(time.strptime(now, "%Y年%m月%d日 %H点%M分")) # time.struct_time(tm_year=2025, tm_1on=1, tm_mday=18, tm_hour=15, tm_min=33, tm_sec=0, tm_wday=5, tm_yday=18, tm_isdst=-1)
# struct_time转化为str format time
struct_time = time.strptime(now, "%Y年%m月%d日 %H点%M分")
print(time.asctime(struct_time)) # Sat Jan 18 15:33:00 2025
print(time.strftime("%Y-%m-%d %H:%M:%S", struct_time)) # 2025-01-18 15:33:00使用
strftime
和strptime
需要使用到日期的匹配模板,一般来说只需要记住以下常用的即可符号 含义 %Y 年 %m 月 %d 日 %H 时 %M 分 %S 秒 不同的字符串时间,匹配模板的连接词也需要对应
1
2
3
4
5
6
7
8strtime = "2025-01-18 15:33:00"
strtime2 = "2025/01/18 15 33 00"
strtime3 = "2025年01月18日 15时33分00秒"
print(time.strptime(strtime, "%Y-%m-%d %H:%M:%S"))
print(time.strptime(strtime2, "%Y/%m/%d %H %M %S"))
print(time.strptime(strtime3, "%Y年%m月%d日 %H时%M分%S秒"))
# time.struct_time(tm_year=2025, tm_mon=1, tm_mday=18, tm_hour=15, tm_min=33, tm_sec=0, tm_wday=5, tm_yday=18, tm_isdst=-1)timestamp与str format time的相互转化
需要
struct_time
作为桥梁flowchart LR a(timestamp) -->|localtime| b(struct_time) b -->|asctime or strftime| c(str format time) b -->|mktime| a c -->|strptime| b a-->|ctime| c
1
2
3
4
5
6
7
8
9
10# 时间戳转化为str format time
now = time.time()
print(time.ctime(now)) # Sat Jan 18 15:55:56 2025
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(now))) # 2025-01-18 15:55:56
# str format time 转化为时间戳
now = "2025年1月18日 15点33分"
print(time.mktime(time.strptime(now, "%Y年%m月%d日 %H点%M分"))) # 1737179980.0
常见应用
计算程序运行时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14import time
start_time:float = time.time()
time.sleep(1)
end_time:float = time.time()
print(end_time - start_time)程序休眠
1
2
3
4
5
6flag = True
if(flag):
time.sleep(5)
print("5秒后执行")
else:
print("不执行")
datetime模块
datetime是对time的封装库,可以很方便对时间进行运算
创建和使用datetime
1 | import datetime |
也可以从str format time和timeStamp转化而来
1 | time1 = time.time( ) |
datetime对象也获取具体时间信息
1 | # datetime对象使用 |
转化关系
datetime对象可转化struct_time、str format time和timeStamp
1 | now = datetime.datetime.now() |
更详细的转化关系如下所示
flowchart LR subgraph a[datetime] -->|datetime.timestamp| b[timestamp] b -->|datetime.fromtimestamp| a end subgraph b -->|time.localtime| c[struct_time] end c -->|time.mktime| b c -->|time.asctime or strftime| d[str format time] d -->|time.strptime| c a -->|datetime.datetime.ctime or strftime| d d -->|datetime.datetime.strptime| a a -->|datetime.datetime.timetuple| c
时间运算
查看datetime源码,可以看到对__equal__
、__add__
、__ads__
在内的魔术方法都进行了实现,这就是为什么datetime对象能够很方便进行时间的运算(基于timedelta
)
大小比较
1
2
3
4
5
6
7
8
9
10day = datetime.datetime(2025, 1, 18)
day2 = datetime.datetime(2025, 1, 18)
day3 = datetime.datetime(2025, 1, 18, 15, 33, 0)
print(day2 == day) # True
print(day3 == day) # False
print(day2 >= day) # True
print(day3 < day) # True加减乘除
1
2
3day = datetime.datetime(2025, 1, 18)
gaokao = datetime.datetime(2025, 6, 7)
print(gaokao - day) # 140 days, 0:00:001
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16day = datetime.datetime(2025, 1, 18)
# 加减一天
print(day + datetime.timedelta(days=1)) # 2025-01-19 00:00:00
print(day + datetime.timedelta(days=-1)) # 2025-01-17 00:00:00
# 加减一小时
print(day + datetime.timedelta(hours=1)) # 2025-01-18 01:00:00
print(day + datetime.timedelta(hours=-1)) # 2025-01-17 23:00:00
# 加减一分钟
print(day + datetime.timedelta(minutes=1)) # 2025-01-18 00:01:00
print(day + datetime.timedelta(minutes=-1)) # 2025-01-17 23:59:00
# 加减一秒
print(day + datetime.timedelta(seconds=1)) # 2025-01-18 00:00:01
print(day + datetime.timedelta(seconds=-1)) # 2025-01-17 23:59:591
2
3
4
5
6
7
8# 乘除法
day = datetime.datetime(2025, 1, 18)
# 加半天
print(day + datetime.timedelta(days=1) / 2) # 2025-01-19 12:00:00
# 加两天
print(day + datetime.timedelta(days=1) * 2) # 2025-01-20 00:00:00绝对值
如果出现时间时间差为负数的情况,可以使用
abs
进行修正1
2
3
4
5
6day = datetime.datetime(2025, 1, 18, 15, 33, 0)
gaokao = datetime.datetime(2025, 6, 7)
print(day - gaokao) # -140 days, 15:33:00
print(abs(day - gaokao)) # 139 days, 8:27:00转化为秒、天
1
2
3
4
5
6# 转化为秒
datetime.timedelta(seconds= 1).total_seconds() # 1.0
datetime.timedelta(minutes= 1).total_seconds() # 60.0
datetime.timedelta(hours= 1).total_seconds() # 3600.0
datetime.timedelta(days= 1).total_seconds() # 86400.0
datetime.timedelta(weeks= 1).total_seconds() # 604800.01
2
3
4
5
6# 转化为秒 有局限性
print(datetime.timedelta(seconds= 1).seconds) # 1
print(datetime.timedelta(minutes= 1).seconds) # 60
print(datetime.timedelta(hours= 1).seconds) # 3600
print(datetime.timedelta(days= 1).seconds) # 0
print(datetime.timedelta(weeks= 1).seconds) # 01
2
3
4
5
6# 转化为天
print(datetime.timedelta(seconds= 1).days) # 0
print(datetime.timedelta(minutes= 1).days) # 0
print(datetime.timedelta(hours= 1).days) # 0
print(datetime.timedelta(days= 1).days) # 1
print(datetime.timedelta(weeks= 1).days) # 7
calendar模块
是一个专门用来处理日期的模块
打印一年的日历
1
2
3
4# 输出日历
import calendar
print(calendar.calendar(2025)) # 输出2025年的日历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
292025
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 1 2
6 7 8 9 10 11 12 3 4 5 6 7 8 9 3 4 5 6 7 8 9
13 14 15 16 17 18 19 10 11 12 13 14 15 16 10 11 12 13 14 15 16
20 21 22 23 24 25 26 17 18 19 20 21 22 23 17 18 19 20 21 22 23
27 28 29 30 31 24 25 26 27 28 24 25 26 27 28 29 30
31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 1 2 3 4 1
7 8 9 10 11 12 13 5 6 7 8 9 10 11 2 3 4 5 6 7 8
14 15 16 17 18 19 20 12 13 14 15 16 17 18 9 10 11 12 13 14 15
21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22
28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29
30
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 1 2 3 1 2 3 4 5 6 7
7 8 9 10 11 12 13 4 5 6 7 8 9 10 8 9 10 11 12 13 14
14 15 16 17 18 19 20 11 12 13 14 15 16 17 15 16 17 18 19 20 21
...
13 14 15 16 17 18 19 10 11 12 13 14 15 16 15 16 17 18 19 20 21
20 21 22 23 24 25 26 17 18 19 20 21 22 23 22 23 24 25 26 27 28
27 28 29 30 31 24 25 26 27 28 29 30 29 30 31打印一月的日历
1
print(calendar.month(2025, 1)) # 输出2025年1月的日历
1
2
3
4
5
6
7January 2025
Mo Tu We Th Fr Sa Su
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日期矩阵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import calendar
month = calendar.monthcalendar(2025, 1)
print(month)
# [[0, 0, 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, 0, 0]]
print("Mo Tu We Th Fr Sa Su")
for week in month:
for day in week:
if day == 0:
print(" ", end=" ")
else:
print(f"{day:2}", end=" ")
print()
"""
Mo Tu We Th Fr Sa Su
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
"""该日期是星期几
1
2# 返回星期几
print(calendar.weekday(2025, 1, 18)) # 5 星期六该年是否是闰年
1
2
3print(calendar.isleap(2025)) # False
# [2000,2024)闰年的数量
print(calendar.leapdays(2000, 2025)) # 7该月有几天,第一天是星期几
1
2# 返回一个元组,第一个元素是星期几,第二个元素是这个月有多少天
print(calendar.monthrange(2025, 2)) # (5, 28)