07-模块与包-2

模块与包

日期、时间相关的模块

日期(calendar)

  • calendar模块输出日历及相关函数,默认以礼拜一为一周的第一天、礼拜日为一周的最后一天。
  • setfirstweekday()方法可以将任意一天设置为第一天,官方文档:https://docs.python.org/zh-cn/3/library/calendar.html。
  • 打印2020年的日历
>>> import calendar
>>> calendar.calendar(2020)
#对机器友好,对人不友好
>>> print(calendar.calendar(2020))
#print输出,对人友好
>>> calendar.firstweekday()#每周第一天是星期一,对应编号是0
0
>>> calendar.setfirstweekday(6)#设置每周日是第一天,对应编号是6
>>> calendar.firstweekday() 
6
>>> print(calendar.calendar(2020))
  • 打印2020年11月的日历
>>> print(calendar.month(2020,11))#以友好方式展示日历
   November 2020
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

>>> print(calendar.monthcalendar(2020,11)) 
[[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, 0, 0, 0, 0, 0]]
#以嵌套列表展示当月日期,日期为空则用0表示
>>> print(calendar.monthrange(2020,11))
(6, 30)
#6表示当前是以哪天的下标作为每周第一天,30表示当月有多少天数
>>> print(calendar.isleap(2020))#isleap用于判断是否是闰年
True
>>> print(calendar.isleap(2019))
False
>>> print(calendar.leapdays(2000,2019))#表示2000年到2019年有5个年份是闰年
5
>>> print(calendar.weekday(2000,11,11))#表示2000年11月11日是星期六
5
>>> print(calendar.weekday(2010,11,11))#表示2010年11月11日是星期四
3

 

 

时间模块(time)

  • time模块提供了各种时间相关的函数,此模块中的功能可能无法处理纪元之前或将来远期日期和时间,对未来的截止点由C库决定,例如对于32位系统,通常是在2038年。此模块中定义的大多数函数调用都具有相同名称的平台C库函数。
  • UTC(世界协调时):又称格林威治标准时间(GMT),与之对应的是各时区的本地时间,如在中国为UTC+8。DST(Daylight Saving Time)即夏令时。
  • epoch:表示开始计时的时刻。不同平台七点值不一样,如Unix系统epoch值为1970年01月01日的00:00:00 UTC
  • timestamp(时间戳):当前时刻与格林威治时间(GMT)即与1970年01月01日的0时0分0秒的时间差值(单位:秒;不含润秒),返回时间戳方式的函数主要有time(),clock()等。
  • 元组(struct_time):struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()
>>> import time
>>> time.gmtime()#不加参数显示当前时间值
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=7, tm_hour=7, tm_min=36, tm_sec=22, tm_wday=6, tm_yday=38, tm_isdst=0)
>>> time.gmtime(0)#参数0,表示起点时间
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
>>> time.time
<built-in function time>
>>> time.time()
1612683399.9588227#表示执行time.time的时刻与linux平台的GMT起点时刻的差值

  • 参考资料
    • https://www.cnblogs.com/tkqasn/p/6001134.html
    • https://www.cnblogs.com/awakenedy/articles/9182036.html
    • https://www.jianshu.com/p/ff329e881683
    • https://www.php.cn/python-tutorials-410535.html
时间戳转换为字符串
>>> import time
>>> time.time()#时间戳
1612685383.513653
>>> time.gmtime()
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=7, tm_hour=8, tm_min=9, tm_sec=57, tm_wday=6, tm_yday=38, tm_isdst=0)
>>> time.localtime()
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=7, tm_hour=16, tm_min=10, tm_sec=7, tm_wday=6, tm_yday=38, tm_isdst=0)
>>> time.gmtime()   
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=7, tm_hour=8, tm_min=10, tm_sec=50, tm_wday=6, tm_yday=38, tm_isdst=0)
>>> time.gmtime().tm_year
2021
>>> time.mktime(time.localtime())#struct_time类型转换位时间戳
1612685514.0
>>> time.asctime(time.localtime())#struct_time类型转换为字符串  
'Sun Feb  7 16:12:15 2021'
>>> time.asctime()
'Sun Feb  7 16:12:21 2021'
>>> time.asctime(time.gmtime())#元数据转字符串
'Sun Feb  7 08:12:37 2021'
>>> 
>>> time.ctime()
'Sun Feb  7 16:12:57 2021'
>>> time.ctime(time.time())
'Sun Feb  7 16:13:06 2021'
>>> 
>>> time.ctime(1612685514.0)#时间戳转字符串
'Sun Feb  7 16:11:54 2021'
  • time模块常用函数

    
>>> a = "Sat Mar 28 22:24:24 2016"
#time.mktime将指定字符串时间,转换为时间戳
>>> print(time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y")))
1459175064.0
>>> print(time.mktime(time.strptime('Sun Feb 7 17:38:15 2021',"%a %b %d %H:%M:%S %Y")))
1612690695.0
#将struct_time类型时间,转换为指定格式的时间
>>> time.gmtime()
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=7, tm_hour=9, tm_min=57, tm_sec=3, tm_wday=6, tm_yday=38, tm_isdst=0)
>>> time.strftime("%Y-%m-%d %X", time.localtime())
'2021-02-07 17:57:26'
#time.strptime将指定字符串时间,转换为struct_time类型时间
>>> print(time.strptime('Sun Feb 7 17:38:15 2021',"%a %b %d %H:%M:%S %Y"))
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=7, tm_hour=17, tm_min=38, tm_sec=15, tm_wday=6, tm_yday=38, tm_isdst=-1)

  • python时间日期格式化符号
    • %y:两位数的年份表示(00-99)
    • %Y:四位数的年份表示(000-9999)
    • %m:月份(01-12)
    • %d:月内中的一天(0-31)
    • %H:24小时制小时数(0-23)
    • %I:12小时制小时数(01-12)
    • %M:分钟数(00-59)
    • %S:秒(00-59)
    • %a:本地简化星期名称
    • %A:本地完整星期名称
    • %b:本地简化的月份名称
    • %B:本地完整的月份名称
    • %c:本地相应的日期表示和时间表示
    • %j:年内的一天(001-366)
    • %p:本地A.M.或P.M.的等价符
    • %U:一年中的星期数(00-53)星期天为星期的开始
    • %w:星期(0-6),星期天为星期的开始
    • %W:一年中的星期数(00-53)星期一为星期的开始
    • %x:本地相应的日期表示
    • %X:本地相应的时间表示
    • %Z:当前时区的名称
    • %%:%号本身

时间模块(datetime)

  • datetime模块:time模块的进一步封装,对用户更加友好
  • datetime模块的主要类:
    • datetime.date:提供日期(年月日)的处理
    • datetime.time:提供时间(时分秒)的处理
    • datetime.datetime:同时提供日期和时间的处理
    • datetime.timedelta:两个date、time、datetime实例之间的时间间隔
    • datetime.tzinfo:时区
  • 官方网址:https://docs.python.org/3/library/datetime.html
  • datetime.date类
    • 类方法和类属性
datetime.date.max date对象所能表示的最大日期。
datetime.date.min date对象所能表示的最小日期。
datetime.date.resolution date对象表示日期的最小单位。这里是天。
datetime.date.today() 返回一个表示当前本地日期的 date 对象。
datetime.date.fromtimestamp(timestamp) 根据给定的时间戮,返回一个date 对象。
datetime.fromordinal(ordinal) 将Gregorian日历时间转换为date对象(Gregorian Calendar:西方国家一种日历表示方法,类似于中国农历)
    • 使用示例
#!/usr/bin/env python
# -*- coding=utf-8 -*-

import datetime
import time
print(datetime.date.max)
print(datetime.date.min)
print(datetime.date.today())
print(datetime.date.resolution)
print(datetime.date.fromtimestamp(time.time()))
#执行结果
PS F:\PyProject\pyscripts\project1\mymodule> python .\date_time.py
9999-12-31
0001-01-01
2021-02-07
1 day, 0:00:00
2021-02-07
    • datetime.date方法与属性
datetime.date.year 
datetime.date.month
datetime.date.day
datetime.date.replace(year[,month[,day]]) 替换并生成返回一个新的日期对象,原日期对象不变
datetime.date.timetuple() 返回日期对应的时间元组(time.struct_time)对象
datetime.date.toordinal() 返回日期是自0001-01-01开始的第多少天
datetime.date.weekday() 返回日期是星期几,[0,6],0表示星期一,1表示星期二
datetime.date.isoweekday() 返回日期是星期几,[1,7],1表示星期一,2表示星期二
datetime.date.isocalendar() 返回格式为(year,weekday,isoweekday)的元组
datetime.date.isoformat() 返回‘YYYY-MM-DD’格式的日期字符串
datetime.date.strftime() 自定义格式化字符串(和time模块的strftime()方法相同)
    • 使用示例
import datetime
import time

print(datetime.date.year) # 显示内存地址
print(datetime.date.today().year)# 本地时时间的年
print(datetime.date.fromtimestamp(time.time()+3600000).month)# 给定时间戳的月
print(datetime.date.today().day)  #

print(datetime.date.today().replace(year=2019))#替换并生成返回一个新的日期对象,原日期对象不变
print(datetime.date.today().timetuple())#返回日期对应的时间元组(time.struct_time)对象
print(datetime.date.today().toordinal())#返回自0001-01-01开始的第多少天
print(datetime.date.today().weekday())#返回星期几,[0,6],0表示星期一,1表示星期二
print(datetime.date.today().isoweekday())#返回星期几,[1,7],1表示星期一,2表示星期二
print(datetime.date.today().isocalendar())#返回格式为(year,weekday,isoweekday)的元组
print(datetime.date.today().isoformat())#返回‘YYYY-MM-DD’格式的日期字符串
print(datetime.date.today().strftime('%Y-%m-%d-%a-%I'))#自定义格式化字符串(和time模块的strftime()方法相同)

#运行结果
PS F:\PyProject\pyscripts\project1\mymodule> python .\date_time.py
<attribute 'year' of 'datetime.date' objects>
2021
3
7
2019-02-07
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=7, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=38, tm_isdst=-1)
737828
6
7
(2021, 5, 7)
2021-02-07
2021-02-07-Sun-12
    • datetime.date对象中包含的方法与属性

      • 用于日期比较大小的方法

>>> a=datetime.date(2017,3,1)
>>> b=datetime.date(2017,3,15)
>>> a.__eq__(b)
False
>>> a.__ge__(b)
False
>>> a.__gt__(b)
False
>>> a.__le__(b)
True
>>> a.__lt__(b)
True
>>> a.__ne__(b)
True
      • 获得二个日期相差多少天:使用__sub__(...)__rsub__(...)
>>> a = datetime.date(2017, 3, 22)
>>> b = datetime.date(2017, 3, 15)
>>> a.__sub__(b)
datetime.timedelta(days=7)
>>> a.__rsub__(b)
datetime.timedelta(days=-7)
>>> a.__sub__(b).days
7
>>> a.__rsub__(b).days
-7
  • datetime.time类
    • 类方法和类属性
    • time类和time模块各自独立,语法:datetime.time(hour[,minute[,decond[,microsecond[,tzinfo]]]])
datetime.time.max 表示的最大时间
datetime.time.min 表示的最小时间
datetime.time.resolution 时间的最小单位,这里是1微秒
    • datetime.time常用的方法与属性
datetime.time.hour
datetime.time.minute
datetime.time.second
datetime.time.microsecond 微秒
datetime.time.tzinfo 时区
datetime.time.replace() 用参数指定替代(时,分,秒,微秒,时区)对象,生成并返回新的对象
datetime.time.isoformat() 返回'HH:MM:SS'格式字符串
datetime.time.strftime() 返回自定义格式化字符串
  • datetime.datetime类
    • 语法(相当于date和time结合记起来):datetime.datetime(year,month,day[,hour[,minute[,second[,microsecond[,tzinfo]]]]])
    • 类方法与类属性
datetime.datetime.max date对象所能表示的最大日期。
datetime.datetime.min date对象所能表示的最小日期。
datetime.datetime.resolution date对象表示日期的最小单位。这里是天。
datetime.datetime.today() 返回一个表示当前本地日期的 date 对象。
datetime.datetime.now([tz]) 返回当前本地时间,如果指定tz,则返回tz时区当地时间
datetime.datetime.utcnow()
返回当前UTC时间
datetime.datetime.fromtimestamp(timestamp) 根据给定的时间戮,返回一个date 对象。
datetime.datetime.utcfromtimestamp(timestamp) 根据时间戳创建一个datetime对象
datetime.datetime.combine(date,time) 把指定的date和time对象整合为datetime对象
datetime.datetime.strftime(date_string,format) 将格式化字符串转换为datetime对象
    • 使用示例
# 3.0 datetime.datetime 类方法和类属性
import datetime
import time
print(datetime.datetime.max)#date对象所能表示的最大日期。
print(datetime.datetime.min)#date对象所能表示的最小日期。
print(datetime.datetime.resolution)#date对象表示日期的最小单位。这里是天。
print(datetime.datetime.today())#返回一个表示当前本地日期的 date 对象。
print(datetime.datetime.now())#返回当前本地时间,如果指定tz,则返回tz时区当地时间
print(datetime.datetime.utcnow())#返回当前UTC时间
print(datetime.datetime.fromtimestamp(time.time()))#根据给定的时间戮,返回一个date 对象。
print(datetime.datetime.utcfromtimestamp(time.time()))#根据时间戳创建一个datetime对象
print(datetime.datetime.combine(datetime.date(2019, 3, 5),datetime.time(3, 2, 45)))#把指定的date和time对象整合为datetime对象
print(datetime.datetime.strftime(datetime.date(2019,9,2),'%Y-%m-%d %X'))#将格式化字符串转换为datetime对象
#运行结果
PS F:\PyProject\pyscripts\project1\mymodule> python .\date_time.py
9999-12-31 23:59:59.999999
0001-01-01 00:00:00
0:00:00.000001
2021-02-07 21:53:23.289024
2021-02-07 21:53:23.289995
2021-02-07 13:53:23.289995
2021-02-07 21:53:23.289995
2021-02-07 13:53:23.289995
2019-03-05 03:02:45
2019-09-02 00:00:00
    • datetime.datetime常用方法和属性
datetime.datetime.year
datetime.datetime.month
datetime.datetime.day
datetime.datetime.hour
datetime.datetime.minute
datetime.datetime.second
datetime.datetime.microsecond 微秒
datetime.datetime.tzinfo 时区信息
datetime.datetime.date() 获取dt的date对象
datetime.datetime.time() 获取dt的time对象,tzinfo为none
datetime.datetime.timetz() 获取dt的time对象,tzinfo为与datetime的tzinfo相同
datetime.datetime.replace() 指定参数替代(年,月,日,时,分,秒,微妙,时区),生成并返回新对象
datetime.datetime.timetuple() 返回日期时间对应的时间元组(time.struct_time)(不包括tzinfo)
datetime.datetime.utctimetuple() 返回UTC时间对应的时间元组(不包括tzinfo)
datetime.datetime.timestamp() 返回dt对象对应的时间戳
datetime.datetime.toordinal() 返回日期是是自 0001-01-01 开始的第多少天(与date类相同)
datetime.datetime.weekday() 返回日期是星期几,[1, 7], 1表示星期一(与date类相同)
datetime.datetime.isocalendar() 返回格式如(year,month,day)的时间元组(与date类相同)
datetime.datetime.isoformat() 返回格式如'YYYY-MM-DD HH:MM:SS'的字符串
datetime.datetime.ctime() 等价与time模块的time.ctime(time.mktime(d.timetuple()))
datetime.datetime.strftime(date_string,format) 将格式化字符串转换为datetime对象
    • 使用示例
import datetime,time
# 3.1 datetime.datetime 常用方法和属性
print(datetime.datetime.today().tzinfo)#时区信息
print(datetime.datetime.today().date())#获取dt的date对象
print(datetime.datetime.today().time())#获取dt的time对象,tzinfo为none
print(datetime.datetime.today().timetz())#获取dt的time对象,tzinfo为与datetime的tzinfo相同
print(datetime.datetime.today().timetuple())#返回日期时间对应的时间元组(time.struct_time)(不包括tzinfo)
print(datetime.datetime.today().timestamp())#返回dt对象对应的时间戳
print(datetime.datetime.today().ctime())#等价与time模块的time.ctime(time.mktime(d.timetuple()))
#运行结果
PS F:\PyProject\pyscripts\project1\mymodule> python .\date_time.py
None
2021-02-08
16:44:12.065155
16:44:12.065155
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=16, tm_min=44, tm_sec=12, tm_wday=0, tm_yday=39, tm_isdst=-1)
1612773852.065155
Mon Feb  8 16:44:12 2021

 

  • datetime.timedelta类
    • 时间加减(代表了两个datetime之间的时间差),语法:datetime.timedalta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0 ,hours=0,weeks=0)
    • 在日期上做天,小时,分钟,秒,毫秒,微秒,周 的时间计算
      • 1毫秒转换为1000微秒
      • 1分钟转换为60秒
      • 1小时转换为3600秒
      • 1周转换为7天
    • 注意:datetime.timedelta内部只存储 days,seconds,microseconds
    • datetime.timedelta常用方法和属性
datetime.timedelta.days 天(范围[-999999999,999999999])
datetime.timedelta.seconds 秒(范围[0,86399])
datetime.timedelta.microseconds 微秒(范围[0,999999])
datetime.timedelta.total_seconds() 以秒为单位返回该时间差
    • 使用示例
>>> import datetime,time
>>> m = datetime.datetime.now()         
>>> print(m)
2021-02-08 17:05:46.028192
>>> l = m + datetime.timedelta(3)
>>> print(l)
2021-02-11 17:05:46.028192
>>> n = m + datetime.timedelta(hours=4)
>>> print(n)
2021-02-08 21:05:46.028192
>>> span = l - m
>>> print(span)
3 days, 0:00:00
>>> print(span.total_seconds())
259200.0
    • 例题1:计算上周一和周日的日期
import datetime,time
>>> today = datetime.date.today()       
>>> today_weekday = today.isoweekday()#返回日期是星期几,[1,7],1表示星期一,2表示星期二 
>>> today_weekday
1
>>> last_sunday = today - datetime.timedelta(days=today_weekday)
>>> last_sunday
datetime.date(2021, 2, 7)
>>> last_monday = today - datetime.timedelta(days=7)
>>> last_monday
datetime.date(2021, 2, 1)
    • 例题2:计算指定日期当月最后一天的日期和该月天数
import datetime,time
import calendar

# 例题:计算指定日期当月最后一天的日期和该月天数
#字符串转日期date格式
pt_day =input("input your day:")
pt_year = time.strptime(pt_day,"%Y-%m-%d").tm_year
pt_mon = time.strptime(pt_day,"%Y-%m-%d").tm_mon
last_day = calendar.monthrange(time.strptime(pt_day,'%Y-%m-%d').tm_year,time.strptime(pt_day,'%Y-%m-%d').tm_mon)[1]
totol_days = calendar.monthrange(time.strptime(pt_day,'%Y-%m-%d').tm_year,time.strptime(pt_day,'%Y-%m-%d').tm_mon)[1]
print("输入的年份是:", pt_year)
print("输入的月份是:",pt_mon)
print("当月最后一天是:",last_day)
print("当月共有天数是:",totol_days)
#运行结果
PS F:\PyProject\pyscripts\project1\mymodule> python .\judge_month_days.py
input your day:2005-05-17
输入的年份是: 2005
输入的月份是: 5
当月最后一天是: 31
当月共有天数是: 31
PS F:\PyProject\pyscripts\project1\mymodule> python .\judge_month_days.py
input your day:2005-02-24
输入的年份是: 2005
输入的月份是: 2
当月最后一天是: 28
当月共有天数是: 28
  • datetime.tzinfo时区类

    tzinfo是一个抽象类,所以不能直接被实例化;时间转换需要用datetime和pytz来转换时区

 

 

 

posted @ 2021-02-08 17:56  西瓜的春天  阅读(72)  评论(0)    收藏  举报