100天精通Python(基础篇)——第31天:三个时间相关标准库

前言

  • 作者介绍:Python领域优质创作者、数据开发工程师
  • 励志成为Python全栈工程师,关注我发现更多精彩~
  • 本文已收录于Python全栈系列专栏:100天精通Python从入门到就业
  • 欢迎订阅,订阅专栏后可私聊进百人Python全栈交流群(手把手教学,问题解答); 还可领取80GPython全栈教程 + 300本计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
  • 加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

在这里插入图片描述
在这里插入图片描述

一、time模块介绍

time库是python处理时间数据的标准库

import time

time模块中三种时间表示方式

  • 时间戳(数字类型)

  • 结构化时间对象

  • 格式化时间字符串

1、时间戳

获取当前时间戳,计算内部时间值,浮点数

>>> import time
>>> time.time()
1647853836.377331

2、结构化时间对象

索引 属性
0 tm_year(年)
1 tm_mon(月)
2 tm_mday(日)
3 tm_hour(时)
4 tm_min(分)
5 tm_sec(秒)
6 tm_wday(周)
7 tm_yday(一年内第几天)
8 tm_isdst(夏时令)

time.gmtime()

将自纪元以来以秒表示的时间转换为struct_time标志始终为零的UTC。如果未提供secs或为None时,time()使用返回的当前时间。

>>> import time
>>> type(time.gmtime())
<class 'time.struct_time'>
>>> time.gmtime()
time.struct_time(tm_year=2022, tm_mon=3, tm_mday=21, tm_hour=9, tm_min=16, tm_sec=36, tm_wday=0, tm_yday=80, tm_isdst=0)

函数返回的值还可使用索引或者变量继续获取内部的变量

例如:time.gmtime().tm_year就可以获取到当前时间的年份,以此类推。

>>> import time
>>> time.gmtime()[0]
2022
>>> time.gmtime().tm_year
2022
>>> time.gmtime()[1]
3
>>> time.gmtime().tm_mon
3
>>> time.gmtime()[2]
21
>>> time.gmtime().tm_mday
21
>>> print("今天是 {}-{}-{}".format(time.gmtime()[0], time.gmtime()[1], time.gmtime()[2]))
今天是 2022-3-21
>>> print("今天是 星期{}".format(time.gmtime().tm_wday + 1))
今天是 星期2

time.localtime()

与gmtime()类似,但转换为当地时间。如果未提供 secs或为None时,time()使用返回的当前时间。

>>> import time
>>> type(time.localtime())
<class 'time.struct_time'>
>>> time.localtime()
time.struct_time(tm_year=2022, tm_mon=3, tm_mday=26, tm_hour=10, tm_min=44, tm_sec=53, tm_wday=5, tm_yday=85, tm_isdst=0)
>>> print("今天是 {}-{}-{}".format(time.localtime()[0], time.gmtime()[1], time.gmtime()[2]))
今天是 2022-3-26

3、格式化时间的字符串

time.ctime()

获取当前时间并以易读方式表示,返回字符串

>>> import time
>>> time.ctime()
'Mon Mar 21 17:14:36 2022'

time.asctime([t])

接受时间元组、通过函数 gmtime() 或 localtime()返回的时间值,返回一个可读的形式的字符串。如果未提供t,则使用返回的当前时间。

注意:asctime()不添加尾随换行符

>>> import time
>>> time.asctime(time.localtime())
'Sat Mar 26 10:28:02 2022'

time.strftime()

格式化日期,接收一个 struct_time 表示的时间,并返回以可读字符串表示的当地时间

格式化字符串 日期/时间说明 值范围和实例
%Y 年份 0000~9999,例如:2022
%m 月份 01~12,例如:3
%B 月份名称 January~December,例如:April
%b 月份名称缩写 Jan~Dec,例如:Apr
%d 日期 01~31,例如:20
%A 星期 Monday~Sunday,例如:Wednesday
%a 星期缩写 Mon~Sun,例如:Wed
%H 小时(24h制) 00~23,例如:12
%I 小时(12h制) 01~12,例如:7
%p 上\下午 AM\PM,例如:PM
%M 分钟 00~59,例如:10
%S 00~59,例如:20
%w 星期几(具体) 1~7,例如:7
%W 整年的第几周 1-52,例如:2
>>> import time
>>> time.strftime('%Y-%m-%d %H:%M:%S')
'2022-03-24 20:11:08'
>>> time.strftime('%Y年%m月%d日 %H时:%M分:%S秒')
'2022年03月24日 20时:12分:08秒'
>>> time.strftime('%Y年%m月%d日 星期%w %H时:%M分:%S秒')
'2022年03月24日 星期4 20时:18分:33秒'

4、三种格式之间的转换

图解
在这里插入图片描述

在这里插入图片描述

时间戳 -> 结构化对象

使用time.gmtime(时间戳)或者time.localtime(时间戳)

import time

# 方法1 UTC时间
print(time.gmtime())
print(time.gmtime(time.time() - 3600))
print("-" * 20)
# 方法2(常用)
print(time.localtime())
print(time.localtime(time.time() - 3600))

输出结果:
在这里插入图片描述

结构化对象 -> 时间戳

使用time.mktime(结构化对象)

import time

print(time.time())
print(time.mktime(time.localtime())) # 精度到秒

输出结果:

1648125741.9042373
1648125741.0

结构化对象 -> 格式化时间字符串

使用time.strftime(格式化形式, time.localtime())或者time.strftime(格式化形式, time.gmtime())

import time

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
print(time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()))

输出结果:

2022-03-24 20:46:02
2022-03-24 12:46:02

格式化时间字符串 -> 结构化对象

使用strptime(str, format) 指定时间字符串

import time

time_str = '2020-07-25 13:23:58'
print(time.strptime(time_str, '%Y-%m-%d %H:%M:%S'))

输出结果:

time.struct_time(tm_year=2020, tm_mon=7, tm_mday=25, tm_hour=13, tm_min=23, tm_sec=58, tm_wday=5, tm_yday=207, tm_isdst=-1)

5、计数函数

time.sleep(num)

使用sleep(s) 函数可以让该线程睡眠s秒,s秒之后自动唤醒。s是拟休眠的时间,单位是秒,可以是浮点数。

案例1

import time

t1 = time.time()
time.sleep(2)  # 让程序岁两秒
t2 = time.time()
print("执行了 {:.3f} 秒".format(t2 - t1))

输出结果:

执行了 2.004

案例2:爬虫小技巧与random搭配使用模拟人工点击

import time
import random

sleep_time = random.uniform(1, 5)
time.sleep(sleep_time)

time.perf_counter()

返回性能计数器的值(以小数秒为单位),即具有最高可用分辨率的时钟,以测量短持续时间。它包括睡眠期间经过的时间,并且是系统范围的。返回值的参考点未定义,因此只有连续调用结果之间的差才有效。

import time

start = time.perf_counter()
time.sleep(1)
end = time.perf_counter()
print("耗时:", end - start)

输出结果:

耗时: 1.0125934

time.process_time()

返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位)。它不包括睡眠期间经过的时间。返回值的参考点未定义,因此只有连续调用结果之间的差异才有效。

import time

start = time.process_time()
time.sleep(1)
end = time.process_time()
print("耗时:", end - start)

输出结果:

耗时: 0.0

二、datetime模块介绍

datatime 模块重新封装了 time 模块,提供了更多接口,变得更加直观和易于调用。关注如何能够更有效地解析其属性用于格式化输出和数据操作

主要介绍四个标准类

  • datetime.date
  • datetime.time
  • datetime.datetime
  • datetime.timedelta

1、datetime.date类

date 类表示一个由年、月、日组成的日期,格式为:datetime.date(year, month, day)

类方法(属性)说明

方法(属性) 说明
today() 返回当地的当前日期
fromtimestamp(timestamp) 根据给定的时间戮,返回本地日期
min date 所能表示的最小日期
max date 所能表示的最大日期
resolution 时间间隔

案例如下:

>>> import time
>>> import datetime

# 查看类型
>>> type(datetime.date.today())
<class 'datetime.date'>

# today()生成
>>> print(datetime.date.today())
2022-03-26

# 指定日期
>>> print(datetime.date(2022, 5, 20))
2022-05-20

# 根据给定的时间戮,返回本地日期
>>> print(datetime.date.fromtimestamp(time.time()))
2022-03-26

# 类属性
>>> print(datetime.date.min)
0001-01-01
>>> print(datetime.date.max)
9999-12-31
>>> print(datetime.date.resolution)
1 day, 0:00:00

实例方法(属性)说明

方法(属性) 说明
year
month
day
timetuple() 返回结构化时间对象 struct_time
replace() 替换(可以替换年、月、日)
weekday() 返回一个整数代表星期几( 0:星期一, 6:星期天)
isoweekday() 返回一个整数代表星期几( 1:星期一, 7:星期天)
isocalendar() 返回格式为 (year,month,day) 的元组
isoformat() 返回格式如 YYYY-MM-DD 格式化的时间字符串
strftime(format) 返回自定义格式的字符串

案例如下:

>>> import datetime
# 实例属性
>>> datetime.date.today().year
2022
>>> datetime.date.today().month
3
>>> datetime.date.today().day
26
>>> datetime.date.today().weekday()
5
>>> datetime.date.today().isoweekday()
6
>>> datetime.date.today().isocalendar()
(2022, 12, 6)
>>> datetime.date.today().isoformat()
'2022-03-26'
>>> datetime.date.today().strftime('%Y年%m月%d日 %H时:%M分:%S秒')
'2022年03月26日 00时:00分:00秒'

# 实例方法
>>> datetime.date.today().timetuple()
time.struct_time(tm_year=2022, tm_mon=3, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=85, tm_isdst=-1)

# 替换日期
>>> print(datetime.date.today().replace(2222))
2222-03-26
>>> print(datetime.date.today().replace(2022,1,30))
2022-01-30
>>> print(datetime.date.today().replace(day=29))
2022-03-29

2、datetime.time类

time 类表示由时、分、秒、微秒组成的时间,格式为:time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

类方法和实例属性如下

方法(属性) 说明
min time 所能表示的最小日期
max time 所能表示的最大日期
resolution 时间相加的最小单位
hour
minute
second
microsecond 微秒
isoformat() 返回格式如 YYYY-MM-DD 格式化的时间字符串
strftime(format) 返回自定义格式的字符串
replace() 创建一个新的时间对象,用参数指定的时、分、秒、微秒代替原有对象中的属性

案例如下:

>>> import datetime
>>> t = datetime.time(15, 10, 45, 888888)

# 类方法
>>> print(t.min)
00:00:00
>>> print(t.max)
23:59:59.999999
>>> print(t.resolution)
0:00:00.000001

# 实例属性
>>> t.hour
15
>>> t.minute
10
>>> t.second
45
>>> t.microsecond
888888

# 其他方法
>>> print(t.isoformat())
15:10:45.888888
>>> print(t.strftime('%Y年%m月%d日 %H时:%M分:%S秒'))
1900010115:10:45>>> print(t.replace(hour=8, minute=8))
08:08:45.888888

3、datetime.datetime类(最常用)

datetime 包括了 date 与 time 的所有信息,格式为:datetime(year, month, day, hour=0,minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0),参数范围值参考date 类与 time 类。

类方法和属性如下所示

方法(属性) 说明
today() 返回当地的当前时间
now(tz=None) 类似于 today(),可选参数 tz 可指定时区
utcnow() 类似于 now(),返回当前 UTC 时间
fromtimestamp(时间戳) 根据时间戳返回对应时间
utcfromtimestamp(时间戳) 根据时间戳返回对应 UTC 时间
strptime(字符串,format) 跟着字符串(对应的格式)返回时间
combine(date, time) 根据 date 和 time 返回对应时间

案例如下:

>>> import datetime
>>> print(datetime.datetime.today())
2022-03-26 14:50:56.924335
>>> print(datetime.datetime.now(tz=None))
2022-03-26 14:51:22.981125
>>> print(datetime.datetime.utcnow())
2022-03-26 06:51:56.038939
# 时间戳 -> dt
>>> print(datetime.datetime.fromtimestamp(time.time()))
2022-03-26 14:55:50.609014
>>> print(datetime.datetime.utcfromtimestamp(time.time()))
2022-03-26 06:57:36.143067
# 字符串 -> dt
>>> print(datetime.datetime.strptime('2022年03月26日 00时:00分:00秒', '%Y年%m月%d日 %H时:%M分:%S 秒'))
2022-03-26 00:00:00
# date+time -> datetime
>>> print(datetime.datetime.combine(datetime.date(2222, 2, 2), datetime.time(2, 2, 2)))
2222-02-02 02:02:02

实例方法说明

方法(属性) 说明
year
month
day
hour
minute
second
microsecond 微秒
replace() 生成一个新的日期对象,用参数指定的年,月,日,时,分,秒…代替原有对象中的属性
timestamp() datetime -> 时间戳
strftime(format) 返回自定义格式的字符串

案例如下:

>>> import datetime
>>> dt = datetime.datetime(2022, 8, 20, 13, 22, 34, 88888)
>>> print(dt, type(dt))
2022-08-20 13:22:34.088888 <class 'datetime.datetime'>
# 属性
>>> dt.year
2022
>>> dt.month
8
>>> dt.day
20
>>> dt.hour
13
>>> dt.minute
22
>>> dt.second
34
>>> dt.microsecond
88888
>>> print(dt.replace(second=57, day=20))
2022-08-20 13:22:57.088888
# datetime -> 时间戳
>>> print(dt.timestamp())
1660972954.088888
# datetime -> 格式化字符串
>>> print(dt.strftime('%Y年%m月%d日 %H时:%M分:%S 秒'))
2022082013:22:34

图解:datetime.datetime类对时间戳与时间字符串进行转换
在这里插入图片描述在这里插入图片描述

4、datetime.timedalta类

计算时间差的类,格式:class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)

案例如下:

>>> import time
>>> import datetime
# 生成时间差
>>> td = datetime.timedelta(days=10)
>>> print(td, type(td))
10 days, 0:00:00 <class 'datetime.timedelta'>
>>> td = datetime.timedelta(days=10,hours=5)
>>> print(td)
10 days, 5:00:00
>>> td = datetime.timedelta(days=10,hours=-5)
>>> print(td)
9 days, 19:00:00

# 计算目标日期
>>> dt = datetime.datetime.today()
>>> print("现在是 {}".format(dt.strftime('%Y年%m月%d日 %H时:%M分:%S秒')))
现在是 2022032615:47:13>>> delta = datetime.timedelta(days=10)
>>> target = dt + delta
>>> print("十天后是 {}".format(target.strftime('%Y年%m月%d日 %H时:%M分:%S秒')))
十天后是 2022040515:47:13>>> dt = datetime.datetime.today()
>>> print("现在是 {}".format(dt.strftime('%Y年%m月%d日 %H时:%M分:%S秒')))
现在是 2022032615:47:13>>> delta = datetime.timedelta(hours=-5)
>>> target = dt + delta
>>> print("五小时之前是 {}".format(target.strftime('%Y年%m月%d日 %H时:%M分:%S秒')))
五小时之前是 2022032610:47:13# 计算时间差

>>> dt1 = datetime.datetime.today()
>>> dt2 = datetime.datetime.utcnow()
>>> td = dt1 - dt2
>>> print("我们与UTC时间差是:{}小时".format(td.seconds/3600))
我们与UTC时间差是:7.994166666666667小时
>>> print("我们与UTC时间差是:{:.0f}小时".format(td.seconds/3600))
我们与UTC时间差是:8小时

三、calendar模块介绍

此模块允许你输出类似Unix cal程序的日历,并提供与日历相关的其他有用功能。值得注意的是,默认情况下,这些日历将星期一作为一周的第一天,将星期日作为一周的最后一天(欧洲惯例)

1、常用方法

  • month(year, month, w=0, l=0):返回一个月的日历的多行文本字符串。year指定年份,month指定月份,w每个单元格宽度,l每列换l行

    import calendar
    
    print(calendar.month(2022, 3))
    
    输出结果:
         March 2022
    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
    
  • prcal(year, w=0, l=0, c=6, m=3):打印一年的日历,w每个单元格宽度,默认0,内部已做处理,最小宽度为2,l每列换l行,默认为0,内部已做处理,至少换行1行,c表示月与月之间的间隔宽度,默认为6,内部已做处理,最小宽度为2,m表示将12个月分为m列

    import calendar
    
    calendar.prcal(2022)
    
    输出结果:
                                      2022
    
          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          1  2  3  4  5  6          1  2  3  4  5  6
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       7  8  9 10 11 12 13
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      14 15 16 17 18 19 20
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      21 22 23 24 25 26 27
    24 25 26 27 28 29 30      28                        28 29 30 31
    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                         1             1  2  3  4  5
     4  5  6  7  8  9 10       2  3  4  5  6  7  8       6  7  8  9 10 11 12
    11 12 13 14 15 16 17       9 10 11 12 13 14 15      13 14 15 16 17 18 19
    18 19 20 21 22 23 24      16 17 18 19 20 21 22      20 21 22 23 24 25 26
    25 26 27 28 29 30         23 24 25 26 27 28 29      27 28 29 30
                              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       1  2  3  4  5  6  7                1  2  3  4
     4  5  6  7  8  9 10       8  9 10 11 12 13 14       5  6  7  8  9 10 11
    11 12 13 14 15 16 17      15 16 17 18 19 20 21      12 13 14 15 16 17 18
    18 19 20 21 22 23 24      22 23 24 25 26 27 28      19 20 21 22 23 24 25
    25 26 27 28 29 30 31      29 30 31                  26 27 28 29 30
    
          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          1  2  3  4  5  6                1  2  3  4
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       5  6  7  8  9 10 11
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      12 13 14 15 16 17 18
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      19 20 21 22 23 24 25
    24 25 26 27 28 29 30      28 29 30                  26 27 28 29 30 31
    31
    
  • calendar(year, w=2, l=1, c=6, m=3):以多行字符串形式返回一年的日历。w每个单元格宽度,l每列换l行,c表示月与月之间的间隔宽度,m表示将12个月分为m列

    import calendar
    
    print(calendar.calendar(2022))
    
    输出结果:
                                      2022
    
          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          1  2  3  4  5  6          1  2  3  4  5  6
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       7  8  9 10 11 12 13
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      14 15 16 17 18 19 20
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      21 22 23 24 25 26 27
    24 25 26 27 28 29 30      28                        28 29 30 31
    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                         1             1  2  3  4  5
     4  5  6  7  8  9 10       2  3  4  5  6  7  8       6  7  8  9 10 11 12
    11 12 13 14 15 16 17       9 10 11 12 13 14 15      13 14 15 16 17 18 19
    18 19 20 21 22 23 24      16 17 18 19 20 21 22      20 21 22 23 24 25 26
    25 26 27 28 29 30         23 24 25 26 27 28 29      27 28 29 30
                              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       1  2  3  4  5  6  7                1  2  3  4
     4  5  6  7  8  9 10       8  9 10 11 12 13 14       5  6  7  8  9 10 11
    11 12 13 14 15 16 17      15 16 17 18 19 20 21      12 13 14 15 16 17 18
    18 19 20 21 22 23 24      22 23 24 25 26 27 28      19 20 21 22 23 24 25
    25 26 27 28 29 30 31      29 30 31                  26 27 28 29 30
    
          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          1  2  3  4  5  6                1  2  3  4
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       5  6  7  8  9 10 11
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      12 13 14 15 16 17 18
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      19 20 21 22 23 24 25
    24 25 26 27 28 29 30      28 29 30                  26 27 28 29 30 31
    31
    
  • setfirstweekday(weekday):设置每一周的开始(0 表示星期一,6 表示星期天)

    import calendar
    
    # 设置星期2为每周第一天
    calendar.setfirstweekday(firstweekday=1)
    
  • firstweekday():返回当前设置的每星期的第一天的数值

    import calendar
    
    # 设置星期2为每周第一天
    calendar.setfirstweekday(firstweekday=1)
    print(calendar.firstweekday()) 
    
    输出结果:
    1
    
  • isleap(year):判断指定是否是闰年,闰年为True,平年为False

    import calendar
    
    print(calendar.isleap(2020))
    print(calendar.isleap(2021))
    
    输出结果:
    True
    False
    
  • leapdays(y1, y2):返回y1与y2年份之间的闰年数量,y1与y2皆为年份。包括起始年,不包括结束年

    import calendar
    
    print(calendar.leapdays(2000, 2022))
    # 闰年有2000、2004、2008、2012、2016、2020
    
    输出结果:
    6
    
  • weekday(year, month, day):获取指定日期为星期几

    import calendar
    
    print(calendar.weekday(2022, 3, 26))
    
    输出结果:
    5 # 代表星期六
    
  • weekheader(n):返回包含星期的英文缩写,n表示英文缩写所占的宽度

    import calendar
    
    print(calendar.weekheader(2))
    
    输出结果:
    Mo Tu We Th Fr Sa Su
    
  • monthrange(year, month):返回一个由一个月第一个天的星期与当前月的天数组成的元组

    import calendar
    
    print(calendar.monthrange(2022, 3))
    
    输出结果:
    (1, 31)
    
  • monthcalendar(year, month):返回一个月中天数列表(不是当前月份的天数为0),按周划分,为一个二维数组。包括月份开始那周的所有日期和月份结束那周的所有日期

    import calendar
    
    print(calendar.month(2022, 3))
    print(calendar.monthcalendar(2022, 3))
    
    输出结果:可以看出0与日历表每行空白处相对应
    
         March 2022
    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, 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]]
    

2、Calendar类

Calendar 对象提供了一些日历数据格式化的方法

  • iterweekdays():获取一周的数字的迭代器,迭代器的第一个值与firstweekday的值相同

    from calendar import Calendar
    
    c = Calendar()
    print(list(c.iterweekdays()))  
         
    c = Calendar(firstweekday=6)
    print(list(c.iterweekdays()))
    
    输出结果:
    [0, 1, 2, 3, 4, 5, 6]代表星期一至星期日,0为星期一,即一周的第一天
    [6, 0, 1, 2, 3, 4, 5]代表星期日至星期六,6为星期日,即一周的第一天
    
  • itermonthdates(year, month):获取一个月日期的迭代器,此迭代器会返回指定月份的所有日期,包括月份开始那周的所有日期和月份结束那周的所有日期

    from calendar import Calendar
    
    c = Calendar(firstweekday=6)
    for item in c.itermonthdates(2022, 3):
        print(item)
    
    输出结果:
    2022-03-28
    2022-03-29
    ........
    2022-04-30
    2022-05-01
    

3、TextCalendar 类

Calendar子类,firstweekday为一个整数,指定一周的第一天,0是星期一(默认),6为星期日,用来生成纯文本日历。

  • formatmonth(year, month, w=0, l=0):以多行字符串形式返回一个月的日历。year指定年,month指定月,w每个单元格宽度,默认0,内部已做处理,最小宽度为2,l每列换l行,默认为0,内部已做处理,至少换行1行

    from calendar import TextCalendar
    
    c = TextCalendar()
    print(c.formatmonth(2022, 3))
    
    输出结果:
         March 2022
    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
    
  • prmonth(theyear, themonth, w=0, l=0):打印formatmonth(theyear, themonth, w=0, l=0)的结果,无返回值

    from calendar import TextCalendar
    
    c = TextCalendar(firstweekday=6)
    c.prmonth(2022, 3)
    
    输出结果:
         March 2022
    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
    
  • formatyear(theyear, w=2, l=1, c=6, m=3):以多行字符串形式返回一年的日历,w每个单元格宽度,l每列换l行,c月与月之间的间隔宽度,m表示将12个月分为m列

    from calendar import TextCalendar
    
    c = TextCalendar()
    print(c.formatyear(2022))
    
    输出结果:
                                      2022
    
          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          1  2  3  4  5  6          1  2  3  4  5  6
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       7  8  9 10 11 12 13
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      14 15 16 17 18 19 20
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      21 22 23 24 25 26 27
    24 25 26 27 28 29 30      28                        28 29 30 31
    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                         1             1  2  3  4  5
     4  5  6  7  8  9 10       2  3  4  5  6  7  8       6  7  8  9 10 11 12
    11 12 13 14 15 16 17       9 10 11 12 13 14 15      13 14 15 16 17 18 19
    18 19 20 21 22 23 24      16 17 18 19 20 21 22      20 21 22 23 24 25 26
    25 26 27 28 29 30         23 24 25 26 27 28 29      27 28 29 30
                              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       1  2  3  4  5  6  7                1  2  3  4
     4  5  6  7  8  9 10       8  9 10 11 12 13 14       5  6  7  8  9 10 11
    11 12 13 14 15 16 17      15 16 17 18 19 20 21      12 13 14 15 16 17 18
    18 19 20 21 22 23 24      22 23 24 25 26 27 28      19 20 21 22 23 24 25
    25 26 27 28 29 30 31      29 30 31                  26 27 28 29 30
    
          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          1  2  3  4  5  6                1  2  3  4
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       5  6  7  8  9 10 11
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      12 13 14 15 16 17 18
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      19 20 21 22 23 24 25
    24 25 26 27 28 29 30      28 29 30                  26 27 28 29 30 31
    31
    

4、HTMLCalendar类

Calendar的子类,firstweekday为一个整数,指定一周的第一天,0是星期一(默认),6为星期日

  • formatmonth(theyear, themonth, withyear=Ture):返回一个月日历的html内容,withyear是否显示年份,默认为True,即显示年份

    from calendar import HTMLCalendar
    
    c = HTMLCalendar()
    print(c.formatmonth(2022, 3, withyear=False))
    
    输出结果:
    <table border="0" cellpadding="0" cellspacing="0" class="month">
    <tr><th colspan="7" class="month">March</th></tr>
    <tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
    <tr><td class="noday">&nbsp;</td><td class="tue">1</td><td class="wed">2</td><td class="thu">3</td><td class="fri">4</td><td class="sat">5</td><td class="sun">6</td></tr>
    <tr><td class="mon">7</td><td class="tue">8</td><td class="wed">9</td><td class="thu">10</td><td class="fri">11</td><td class="sat">12</td><td class="sun">13</td></tr>
    <tr><td class="mon">14</td><td class="tue">15</td><td class="wed">16</td><td class="thu">17</td><td class="fri">18</td><td class="sat">19</td><td class="sun">20</td></tr>
    <tr><td class="mon">21</td><td class="tue">22</td><td class="wed">23</td><td class="thu">24</td><td class="fri">25</td><td class="sat">26</td><td class="sun">27</td></tr>
    <tr><td class="mon">28</td><td class="tue">29</td><td class="wed">30</td><td class="thu">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
    </table>
    
  • formatyear(theyear, width=3):返回一年日历的html内容,width表示将12个月分为width列

    from calendar import HTMLCalendar
    
    c = HTMLCalendar()
    print(c.formatyear(2022, width=3))
    
  • formatyearpage(theyear, width=3, css=’calendar.css’, encoding=None):返回一年日历的html内容,width表示将12个月分为width列,css可自定义css样式,encoding编码方式

    from calendar import HTMLCalendar
    
    c = HTMLCalendar()
    print(c.formatyearpage(2022, width=4))
    

猜你喜欢

转载自blog.csdn.net/yuan2019035055/article/details/123640586