有了time及datetime模块,再结合日历(Calendar)模块就可以更好的覆盖到时间处理的各个方面的应用。
日历模块主要是用于处理日历及星期相关操作,如获取当天是星期几,判断是否是闰年平年,获取当前月份的天数,甚至直接返回一个日历输出等。
使用日历(Calendar)模块之前,先导入它:
import calendar
以下表格整理了calendar的常用函数:
函数名 | 描述 |
---|---|
calendar.month(year, month) | 返回某年某月的日历 |
calendar.setfirstweekday(day) | 设置某一天为一周的第一天,从0开始,0代表星期一 |
calendar.firstweekday() | 返回一周的第一天是星期几 |
calendar.calendar(year, w, l, m) | 返回某年的日历,3个月为一行。w每日宽度间隔字符;l每行间隔距离;m是每星期行数。 |
calendar.isleap(year) | 返回布尔值,某年是闰年返回 True,否则为 false。 |
calendar.leapdays(y1, y2) | 返回y1年与y2年之间的闰年总数。 |
calendar.monthcalendar(year,month) | 返回一个单层嵌套列表。每个子列表装载一个星期的整数。某年某月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。 |
calendar.monthrange(year,month) | 返回两个整数。在返回结果中:第一个是该月的第一天是星期几,第二个是该月的天数。星期几是从0(星期一)到 6(星期日)。 |
calendar.prcal(year, w, l, m) | 自带打印输出日历 等于:print(calendar.calendar(year, w, l, m)) |
calendar.prmonth(year, month) | 自带打印输出月的日历,等于 print(year, month) |
calendar.timegm(时间元组参数) | 和time.gmtime相反,接收一个时间元组,返回该时刻的时间戳(1970纪元后经过的浮点秒数)。calendar.timegm 是不会自动添加时区转换的 |
calendar.weekday(year,month,day) | 输入年月日,知道该日是星期几(注意,返回值依然按照从 0 到 6 依次对应星期一到星期日) |
本表格中的函数都在案例中进行了实践,可直接运行案例看结果。
下面的例子包含了日历常用函数所有的实践操作。
import calendar
import time
# 打印2020年3月的日历
print(calendar.month(2020, 3))
# 将星期一设置为一周的第一天
calendar.setfirstweekday(0) # 0代表星期一、1代表星期二
print(calendar.firstweekday())
# 返回一个年历,3个月一行。每日宽度间隔为2字符;每行间隔距离为1;4是每星期行数。
print(calendar.calendar(2020, 2, 1, 4))
# 是闰年返回 True,否则为 false。
print("是否是闰年:", calendar.isleap(2020))
# 返回2000,2020两年之间的闰年总数。
print("闰年总数:", calendar.leapdays(2000, 2020))
# 返回一个单层嵌套列表。每个子列表装载一个星期的整数。2020年3月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
print(calendar.monthcalendar(2020, 3))
# 返回两个整数。在返回结果中:第一个是该月的第一天是星期几,第二个是该月的天数。星期几是从0(星期一)到 6(星期日)。
print(calendar.monthrange(2020, 3))
# 自带打印输出日历 等于print(calendar.calendar(2020, 2, 1, 4))
calendar.prcal(2020, 2, 1, 4)
# 自带打印输出月的日历,等于 print(calendar.month(2020, 3))
calendar.prmonth(2020, 3)
# calendar.timegm 是不會自動加時區的
# 和time.gmtime相反,接收一个时间元组,返回该时刻的时间戳(1970纪元后经过的浮点秒数)
print("time模块获取当前时间元组:", time.gmtime())
print("将时间元组转换成时间戳:", calendar.timegm((2020, 3, 16, 7, 52, 10, 0, 76, 0)))
# 提前定义一个函数,将数字转换为中文星期,类似java 的 switch case 语句
def getChineseWeek(w):
# 如果w在字典dic中,则返回dic[key];否则返回default(未指定,则默认为None)
dic = { # 定义一个字典
0: "星期一",
1: "星期二",
2: "星期三",
3: "星期四",
4: "星期五",
5: "星期六",
6: "星期日"
}
val = dic.get(w, "参数传入错误") # 从字典中取出值,当没有获取到对应的值,则返回‘无效的参数’
return val
# 输入年月日,知道该日是星期几(注意,返回值依然按照从 0 到 6 依次对应星期一到星期日)。
year, month, day = 2020, 3, 16# 横向多个变量赋值
print("%s年%s月%s日这一天是:%s" % (year, month, day, getChineseWeek(calendar.weekday(year, month, day))))# 调用函数getChineseWeek,以及打印多个变量的语句用法,%s格式化为字符串变量
March 2020
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
0
2020
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
6 7 8 9 10 11 12 3 4 5 6 7 8 9 2 3 4 5 6 7 8
13 14 15 16 17 18 19 10 11 12 13 14 15 16 9 10 11 12 13 14 15
20 21 22 23 24 25 26 17 18 19 20 21 22 23 16 17 18 19 20 21 22
27 28 29 30 31 24 25 26 27 28 29 23 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 1 2 3 1 2 3 4 5 6 7
6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14
13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21
20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28
27 28 29 30 25 26 27 28 29 30 31 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 1 2 1 2 3 4 5 6
6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13
13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20
20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27
27 28 29 30 31 24 25 26 27 28 29 30 28 29 30
31
October November December
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 1 1 2 3 4 5 6
5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13
12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20
19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27
26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31
30
是否是闰年: True
闰年总数: 5
[[0, 0, 0, 0, 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, 0, 0, 0]]
(6, 31)
2020
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
6 7 8 9 10 11 12 3 4 5 6 7 8 9 2 3 4 5 6 7 8
13 14 15 16 17 18 19 10 11 12 13 14 15 16 9 10 11 12 13 14 15
20 21 22 23 24 25 26 17 18 19 20 21 22 23 16 17 18 19 20 21 22
27 28 29 30 31 24 25 26 27 28 29 23 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 1 2 3 1 2 3 4 5 6 7
6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14
13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21
20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28
27 28 29 30 25 26 27 28 29 30 31 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 1 2 1 2 3 4 5 6
6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13
13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20
20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27
27 28 29 30 31 24 25 26 27 28 29 30 28 29 30
31
October November December
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 1 1 2 3 4 5 6
5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13
12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20
19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27
26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31
30
March 2020
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
time模块获取当前时间元组: time.struct_time(tm_year=2020, tm_mon=3, tm_mday=16, tm_hour=9, tm_min=17, tm_sec=13, tm_wday=0, tm_yday=76, tm_isdst=0)
将时间元组转换成时间戳: 1584345130
2020年3月16日这一天是:星期一
日历模块还是很有用的,在处理星期这类问题比较常用到。
时间戳的概念也就是一串毫秒数,如: 1584345130。
本文用到了Python3的另外一个数据类型:字典,字典在java中有点类似Map类,取值通过get方法。
日历模块可以在控制台直接打印出一个排列好的字符串的日历,非常直观,应用场景暂时还没想到。