python时间处理之calendar模块

365 阅读8分钟

calendar,是与日历相关的模块,calendar文件里定义了很多类型,主要有Calendar,TextCalendar以及HTMLCalendar类型。其中,Calendar是TextCalendar与HTMLCalendar的基类。该模块文件还对外提供了很多方法,例如:calendar,month,prcal,prmonth之类的方法。本文主要对calendar模块的方法进行介绍

1.日历打印

1.1calendar()方法

返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。

import calendar
​
print(calendar.calendar(2021, w=2, l=1, c=6))

result:

                                  2021
    
      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       1  2  3  4  5  6  7       1  2  3  4  5  6  7
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       8  9 10 11 12 13 14
11 12 13 14 15 16 17      15 16 17 18 19 20 21      15 16 17 18 19 20 21
18 19 20 21 22 23 24      22 23 24 25 26 27 28      22 23 24 25 26 27 28
25 26 27 28 29 30 31                                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                      1  2          1  2  3  4  5  6
 5  6  7  8  9 10 11       3  4  5  6  7  8  9       7  8  9 10 11 12 13
12 13 14 15 16 17 18      10 11 12 13 14 15 16      14 15 16 17 18 19 20
19 20 21 22 23 24 25      17 18 19 20 21 22 23      21 22 23 24 25 26 27
26 27 28 29 30            24 25 26 27 28 29 30      28 29 30
                          31
​
        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                         1             1  2  3  4  5
 5  6  7  8  9 10 11       2  3  4  5  6  7  8       6  7  8  9 10 11 12
12 13 14 15 16 17 18       9 10 11 12 13 14 15      13 14 15 16 17 18 19
19 20 21 22 23 24 25      16 17 18 19 20 21 22      20 21 22 23 24 25 26
26 27 28 29 30 31         23 24 25 26 27 28 29      27 28 29 30
                          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       1  2  3  4  5  6  7             1  2  3  4  5
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       6  7  8  9 10 11 12
11 12 13 14 15 16 17      15 16 17 18 19 20 21      13 14 15 16 17 18 19
18 19 20 21 22 23 24      22 23 24 25 26 27 28      20 21 22 23 24 25 26
25 26 27 28 29 30 31      29 30                     27 28 29 30 31

1.2 month()方法

返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。

print(calendar.month(2021, 12, w=2, l=1))

result:

   December 2021
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.3 prcal()方法

相当于print(calendar.calendar())

calendar.prcal(2021, w=2, l=1, c=6)

result:

                                  2021
    
      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       1  2  3  4  5  6  7       1  2  3  4  5  6  7
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       8  9 10 11 12 13 14
11 12 13 14 15 16 17      15 16 17 18 19 20 21      15 16 17 18 19 20 21
18 19 20 21 22 23 24      22 23 24 25 26 27 28      22 23 24 25 26 27 28
25 26 27 28 29 30 31                                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                      1  2          1  2  3  4  5  6
 5  6  7  8  9 10 11       3  4  5  6  7  8  9       7  8  9 10 11 12 13
12 13 14 15 16 17 18      10 11 12 13 14 15 16      14 15 16 17 18 19 20
19 20 21 22 23 24 25      17 18 19 20 21 22 23      21 22 23 24 25 26 27
26 27 28 29 30            24 25 26 27 28 29 30      28 29 30
                          31
​
        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                         1             1  2  3  4  5
 5  6  7  8  9 10 11       2  3  4  5  6  7  8       6  7  8  9 10 11 12
12 13 14 15 16 17 18       9 10 11 12 13 14 15      13 14 15 16 17 18 19
19 20 21 22 23 24 25      16 17 18 19 20 21 22      20 21 22 23 24 25 26
26 27 28 29 30 31         23 24 25 26 27 28 29      27 28 29 30
                          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       1  2  3  4  5  6  7             1  2  3  4  5
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       6  7  8  9 10 11 12
11 12 13 14 15 16 17      15 16 17 18 19 20 21      13 14 15 16 17 18 19
18 19 20 21 22 23 24      22 23 24 25 26 27 28      20 21 22 23 24 25 26
25 26 27 28 29 30 31      29 30                     27 28 29 30 31

1.4 prmonth()方法

相当于print(calendar.month())

calendar.prmonth(2021, 12, w=2, l=1)

result:

 December 2021
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

2. 闰年判断

2.1 isleap()方法

是闰年返回True,否则为False

print(calendar.isleap(1900))

result:

False
print(calendar.isleap(2020))

result:

True
print(calendar.isleap(2019))

result:

False
print(calendar.isleap(2000))

result:

True

2.2 leapdays()方法

返回在起始年份和结束年份(不包括结束年份)之间的闰年总数。

print(calendar.leapdays(1949, 2021))

result:

18

注:leapdays后面两个参数,实际抽取时,不包含第二个参数。即第二个参数即使是闰年,也不做统计

print(calendar.leapdays(1949, 2024))

result:

18

这里的2024不被包含,事实上截止到2023年,所以即使2024年是闰年也不纳入计算,所以这里仍然和上面末尾为2021年的计算结果一致

3.星期相关

3.1 firstweekday()方法

返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一

print(calendar.firstweekday())

result:

0

3.2 monthcalendar()方法

返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。

print(calendar.monthcalendar(2021, 12))

result:

[[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]]

3.3 monthrange()方法

返回两个整数。第一个是该月的第一天是星期几,第二个是该月总共有多少天

print(calendar.monthrange(2021, 12))

result:

(2, 31)

3.4 setfirstweekday()方法

设置每周的起始日期为星期几

print(f'设置前:{calendar.firstweekday()}')
calendar.setfirstweekday(5)
print(f'设置后:{calendar.firstweekday()}')

result:

设置前:0
设置后:5

注:此处设置后关闭IDLE后重启,将恢复原样,0(星期一)到6(星期日)

3.5 weekday()方法

返回一个整数,表示给定的日期是星期几

print(calendar.weekday(2021, 12, 23))

result:

3

4.其他

4.1 timegm()方法

将时间元组转换成时间戳,与time.gtime()方法作用恰好相反

print(calendar.timegm((2021, 12, 23, 10, 13, 34)))

result:

1640254414
import timeprint(time.gmtime(1640254414))

result:

time.struct_time(tm_year=2021, tm_mon=12, tm_mday=23, tm_hour=10, tm_min=13, tm_sec=34, tm_wday=3, tm_yday=357, tm_isdst=0)