【Python案例】(二)时间模块:time、datetime、calendar

一、Python中的时间表达

1. 时间模块的使用场景

对时间的处理可以归为以下3钟:

时间的显示:在屏幕显示,记录日志等”2022-04-07“

时间的转换:比如把字符串格式的日期转成Python中的日期类型

时间的运算:计算两个日期间的差值等

程序运行暂停秒数

Post请求需要上传时间戳:爬虫或者网页测试时,payload中有参数是时间戳(timestamp)格式。

2. 表达时间的方式

  1. 时间戳(timestamp),表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。点左侧的数字表示秒,右侧的数字表示秒之间的毫秒

    UTC(Universal Time Coordinated):协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。(世界统一时间)

    DST(Daylight Saving Time)即夏令时

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XaZSAzcU-1649993133125)(D:\learning\自媒体发布内容\image-20220412093303121.png)]

    UTC和GMT的区别:

    1. Coordinated Universal Time 协调世界时。因为地球自转越来越慢,每年都会比前一年多出零点几秒,每隔几年协调世界时组织都会给世界时+1秒,让基于原子钟的世界时和基于天文学(人类感知)的格林尼治标准时间相差不至于太大。并将得到的时间称为UTC,这是现在使用的世界标准时间。

    2. GMT:Greenwich Mean Time 格林尼治标准时间。这是以英国格林尼治天文台观测结果得出的时间,这是英国格林尼治当地时间,这个地方的当地时间过去被当成世界标准的时间。

    3. 协调世界时不与任何地区位置相关,也不代表此刻某地的时间,所以在说明某地时间时要加上时区

      也就是说GMT并不等于UTC,而是等于UTC+0,只是格林尼治刚好在0时区上。GMT = UTC+0

    例子:

    北京时区是东八区,领先UTC八个小时,在电子邮件信头的Date域记为+0800。如果在电子邮件的信头中有这么一行:

    Date: Fri, 08 Nov 2002 09:42:22 +0800

    说明信件的发送地的地方时间是二OO二年十一月八号,星期五,早上九点四十二分(二十二秒),这个地方的本地时领先UTC八个小时(+0800, 就是东八区时间)。

    公式:UTC + (+0800) = 本地(北京)时间

  2. 格式化的事件字符串,”2022-04-11 17:34“

  3. 元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库:time.struct_time(tm_year=2020, tm_mon=4, tm_mday=10, tm_hour=2, tm_min=53, tm_wday=2, tm_yday=100, tm_isdst=0)

索引(Index)属性(Attribute)值(Values)
0tm_year(年)2022
1tm_mon (月)1 - 12
2tm_mday (日)1 - 31
3tm_hour(时)0 - 23
4tm_min (分)0 - 59
5tm_sec (秒)0 - 59
6tm_wday (weekday)0 - 6(0表示周日)
7tm_yday (一年中的第几天)1 - 366
8tm_isdst (是否是夏令时)默认为-1

3.格式化日期

序号符号描述
1%y两位数的年份表示(00-99)
2%Y四位数的年份表示(0000-9999)
3%m月份(01-12)
4%d月中的一天(0-31)
5%H24小时制小时数(0-23)
6%l12小时制小时数(01-12)
7%M分钟数(00-59)
8%S秒(00-59)
9%a本地简化星期名称
10%A本地完整星期名称
11%b本地简化月份名称
12%B本地完整的月份名称
13%c本地相应的日期表示和时间表示
14%j年内的一天(001-366)
15%p本地AM或PM的等价符
16%U一年中的星期数(00-53),星期天为星期的开始
17%w星期(0-6),星期天为星期的开始
18%W一年中的星期数(00-53),星期一为星期的开始
19%x本地相应的日期表示
20%X本地相应的时间表示
21%Z当前时区的名称
22%%%号本身

二、time模块

2.1 time模块的常用方法

  • time.time(): 返回当前时间的时间戳。

  • time.localtime([secs]):将一个时间戳转换为当前时区的struct_time。若secs参数未提供,则以当前时间为准

  • time.gmtime([secs]):和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。

  • time.mktime(t):将一个struct_time转化为时间戳。

  • time.sleep(secs):线程推迟指定的时间运行,单位为秒。

  • time.strftime(format[, t]):把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。

    >>> time.strftime("%Y-%m-%d %X", time.localtime()) # 时间转字符串
    '2022-04-12 10:26:26'
    
  • time.strptime(string, format):把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。

    >>> now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    >>> time.strptime(now, "%Y-%m-%d %H:%M:%S")
    time.struct_time(tm_year=2022, tm_mon=4, tm_mday=12, tm_hour=10, tm_min=35, tm_sec=46, tm_wday=1, tm_yday=102, tm_isdst=-1)
    

2.2 使用流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GJojygW4-1649993133133)(D:\learning\自媒体发布内容\time.jpg)]

三、datetime模块

datetime模块可以看做是对time模块的一个高级封装。time模块解决了时间的获取和表示,datetime模块则进一步解决了快速获取并操作时间中的年月日时分秒信息的能力。

3.1 datetime模块中的类:

  • datetime.date:表示日期的类,常用属性有year,month,day
  • datetime.time:表示时间的类。常用的属性有hour,minute,second,microsecond
  • datetime.datetime:表示日期时间
  • datetime.timedelta:表示时间间隔,即两个时间点之间的长度
  • datetime.tzinfo:与时区有关的相关信息。

3.2 常用方法

  1. d = datetime.datetime.now():返回当前的datetime日期类型

    >>> from datetime import datetime
    >>> d = datetime.now()
    >>> d.timetuple()
    1649898508.903568
    >>> d.today()
    datetime.datetime(2022, 4, 14, 9, 8, 52, 261922)
    >>> type(d.today())
    datetime.datetime
    >>> d.timetuple()
    time.struct_time(tm_year=2022, tm_mon=4, tm_mday=14, tm_hour=9, tm_min=9, tm_sec=42, tm_wday=3, tm_yday=104, tm_isdst=-1)
    >>> type(d.timetuple)
    builtin_function_or_method
    
    
  2. datetime.date.fromtimestamp(1341321):把一个时间戳转为datetime日期类型

  3. 时间运算datetime.timedelta()

import datetime
d =datetime.datetime.now()
d+ datetime.timedelta(-5,hours = 20)
  1. 时间替换datetime.timedelta()
>>> import datetime 
>>> d = datetime.datetime.now()
>>> print(d)
>>> print(d.replace(year=2120, month=8))
2022-04-15 10:31:32.374366
2120-08-15 10:31:32.374366

四、calendar模块

calendar模块是与日历相关的若干函数和类,可以生成文本形式的日历。

1.查询日历

1.1 日历文本

calendar.calendar(<年>,<列间隔>,<行间隔>): 返回日历(一年)的文本格式(行列间隔是指行列间的空格数

calendar.month(<年>,<月>,<列间隔>,<行间隔>): 返回日历(一个月)的文本格式

>>> import calendar 
>>> print(calendar.month(2022,4)) # 需要加print,如果不加print,jupter直接展示,显示内容是不规则的

     April 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

>>> cd.month(2022,4)
'    April 2021\nMo Tu We Th Fr Sa Su\n             1  2  3\n 4  5  6  7  8  9 10\n11 12 13 14 15 16 17\n18 19 20 21 22 23 24\n25 26 27 28 29 30 31\n'

1.2 打印日历

calendar.prcal(<年>,<列间隔>,<行间隔>): 打印日历(一年)

calendar.prmonth(<年>,<月>,<列间隔>,<行间隔>):打印日历(一个月)

>>> import calendar as cd
>>> cd.prmonth(2021,10)
    October 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 闰年相关细算

  1. 判断闰年:calendar.isleap(*<年>*)
  2. 判断两年之间有多少个闰年:calendar.leapdays(*<年1>*,*<年2>*)
>>> import calendar as cd
>>> cd.isleap(2000)
True
>>> cd.leapdays(1900,2000)
24

2.2 其他

calendar.monthrange(*<年>*,*<月>*): 返回该月的第一天是星期几和一共有多少天

calendar.weekday(*<年>*,*<月>*,*<日>*): 查询某日是星期几

calendar.monthcalendar(*<年>*,*<月>*): 日历列表化

#星期一是0
>>> import calendar as cd
>>> cd.monthrange(2021,10)  
(4, 31)
>>> cd.weekday(2021,10,1)
4
>>> cd.monthcalendar(2021,10)
[[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]]
编辑于 2021-12-28 23:38

参考资料:

  1. https://www.bilibili.com/video/BV1xh411i7Hn?p=6&spm_id_from=pageDriver

  2. 网络资料: https://zhuanlan.zhihu.com/p/427830785

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值