(十三)Python中级知识-日历(Calendar)模块

1、概述

有了time及datetime模块,再结合日历(Calendar)模块就可以更好的覆盖到时间处理的各个方面的应用。
日历模块主要是用于处理日历及星期相关操作,如获取当天是星期几,判断是否是闰年平年,获取当前月份的天数,甚至直接返回一个日历输出等。
使用日历(Calendar)模块之前,先导入它:

import calendar

2、常用函数

以下表格整理了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 依次对应星期一到星期日)

本表格中的函数都在案例中进行了实践,可直接运行案例看结果。

3、案例

下面的例子包含了日历常用函数所有的实践操作。

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
2020316日这一天是:星期一

4、总结

日历模块还是很有用的,在处理星期这类问题比较常用到。
时间戳的概念也就是一串毫秒数,如: 1584345130。
本文用到了Python3的另外一个数据类型:字典,字典在java中有点类似Map类,取值通过get方法。
日历模块可以在控制台直接打印出一个排列好的字符串的日历,非常直观,应用场景暂时还没想到。

你可能感兴趣的:(Python)