Python学习笔记:3.3.4 时间相关模块

本文是学习齐老师的《python全栈工程师》课程的笔记,欢迎学习交流。同时感谢齐老师的精彩传授!

一、课程目标
  • 了解标准库的calendar模块
  • 了解标准库的time模块
  • 了解标准库的datetime模块
二、详情解读

01.calendar模块:

  • calendar 模块输出日历及相关的函数。
    – 默认,礼拜一作为一周的第一天;礼拜日作为一周的最后一天
    – 用setfirstweekday()方法可以将第一天设置为礼拜日,或者其他任意一天
    – 官方文档:https://docs.python.org/zh-cn/3/library/calendar.html
# 交互模式下:
>>> import calendar
>>> print(calendar.calendar(2019))

输出如下内容:
Python学习笔记:3.3.4 时间相关模块_第1张图片

# 交互模式下:
>>> import calendar
>>> calendar.firstweekday() # 一周中的第一天,默认是0,即周一
0
>>> calendar.setfirstweekday(6) # 将周日设置为一周中的第一天
>>> calendar.firstweekday()
6
>>> print(calendar.calendar(2019))

Python学习笔记:3.3.4 时间相关模块_第2张图片

>>> print(calendar.month(2019, 11))

将输出如下结果,(注意:前面已经将周日设置为一周第一天了)
Python学习笔记:3.3.4 时间相关模块_第3张图片
以列表的形式得到某个月的日历:
在这里插入图片描述

# 获取某个月的第一天是星期几,这个月共几天
>>> calendar.monthrange(2019, 11)
(4, 30) # 4表示11月份的第一天是星期四,11月份共有30天

>>> calender.isleap(2019)
False # 2019不是闰年
>>> calendar.isleap(2000)
True # 2000是闰年

>>> calendar.leapdays(2000, 2019)
5 # 表示2000年到2019年之间有5个闰年

>>> calendar.weekday(2019, 11, 11)
0 # 表示2019年11月11号是星期一,0是星期一,6是星期日

在这里插入图片描述
02.time模块:

  • time模块提供了各种时间相关的函数。 此模块中的功能可能无法处理纪元之前或将来的远期日期和时间。未来的截止点由c库决定,例如对于32位系统,它通常在2038年。此模块中定义的大多数函数调用都具有相同名称的平台c库函数。因为这些函数的意义因平台而异,所以使用时最好阅读平台相关文档。
  • UTC(世界协调时) 又称格林尼治标准时间(GMT),与之对应的是各个时区的本地时间,如:北京时间。
  • epoch: 表示开始计时的时刻,对于Unix而言,epoch(时刻)值为:1970处01月01日的 00:00:0UTC.
  • timestamp(时间戳): 当前时刻与格林尼治时间1970年1月1日0时0分0秒之间的时间间隔(单位:秒)(注:包含闰秒)。

Python学习笔记:3.3.4 时间相关模块_第4张图片

# 交互模式下:
>>> import time
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
>>> time.time()
157412760.192193
>>> time.localtime()
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=9, tm_hour=11, tm_min=9, tm_se
c=0, tm_wday=0, tm_yday=343, tm_isdst=0)
>>> time.gmtime()
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=9, tm_hour=3, tm_min=9, tm_sec
=5, tm_wday=0, tm_yday=343, tm_isdst=0)
>>> time.gmtime().tm_year
2019

类型转换:

  • struct_time类型转换为时间戳
  • struct_time类型转换为字符串
  • 时间戳转换为字符串
# 交互模式下:
# 转换为时间戳
>>> time.mktime(time.localtime())
1575597358.0

# 转换为字符串
>>> time.asctime(time.localtime())
'Fri Dec  6 09:56:18 2019'
>> time.asctime(time.gmtime())
'Fri Dec  6 01:57:31 2019'
>>> time.ctime()
'Fri Dec  6 09:58:36 2019'
>>> time.ctime(time.time())
'Fri Dec  6 09:59:17 2019'

# 时间戳转换为字符串
>>> time.ctime(123456789.123)
'Fri Nov 30 05:33:09 1973'

格式化时间字符串

  • time.strftime(format[,t])
    – 格式:https://docs.python.ogr/zh-cn/3/library/time.html#time.strftime
    – t是struct_time类型的时间
  • time.strptime(string, format)
    – 根据格式解析表示时间的字符串
    – 返回值为 struct_time 类型
# 交互模式下
>>> time.strftime('%Y-%m-%d %H:%I:%S', time.localtime())
'2019-12-06 10:10:02'
>>> time.strftime('%Y年%m月%d日 %M时%I分%S秒', time.localtime())
'2019年12月06日 10时19分04秒'
# 如果有报错:UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' 
# in position 2 : encoding error 的同学,可以用下面这个:
>>> time.strftime('%Y{y}%m{m}%d{d} %H{h}%M{f}%S{s}').format(y='年', m='月', d='日', h='时', f='分', s='秒')
'2019年12月06日 10时19分04秒'
>>> time.strptime('2019年11月11日 11时11分11秒', '%Y年%m月%d日 %H时%M分%S秒')
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=11, tm_hour=11, tm_min=11, tm_
sec=11, tm_wday=0, tm_yday=315, tm_isdst=-1)

02.datetime模块:

  • datetime模块是time模块的进一步封装,对用户更加友好
  • datetime模块的功能主要有:
    – date:提供日期(年、月、日)的处理
    – time:提供时间(时、分、秒)的处理
    – datetime:同时提供对日期和时间的处理
    – timedelta:两个date、time、datetime实例之间的时间间隔
    – tzinfo:时区
  • 官方文档:https://docs.python.org/3/library/datetime.html

datetime.time:

  • class datetime.time(hour, [minute[, second[, microsecond[, tzinfo]]]])
    – hour/minute/second/microsecond/tzinfo
    – replace(hour[, minute[, second[, microsecond[, tzinfo]]]]):生成并返回一个新的时间对象,原时间对象不变
    – isoformat():返回一个 ’HH:MM:SS.%f’ 格式的时间字符串
    – strftime():返回指定格式的时间字符串,与time模块的strftime(format, struct_time)功能相同。
# 交互模式下:
>>> import datetime
>>> t = datetime.time(11, 12, 13,777)
>>> t.hour
11
>>> t.second
13
>>> t.__format__('%H:%M:%S')
'11:12:13'
>>> t.__format__('%S:%M:%H')
'13:12:11'
>>> t.strftime('%H:%M:%S')
'11:12:13'
>>> t.isoformat()
'11:12:13.000777'
>>> t.replace(hour=15)
datetime.time(15, 12, 13, 777)
>>> t
datetime.time(11, 12, 13, 777)

datetime.date:

  • class datetime.date(year, month, day)
    – year/month/day
    – replace(year[, month[, day]]):生成并返回一个新的日期对象,原日期对象不变
    – timetuple():返回日期对应的struct_time对象
    – toordinal():返回公元公历开始到现在的天数。公元1年1月1日为1
    – weekday():返回日期是星期几,[0, 6],0表示星期一
    – isoweekday():返回日期是星期几,[1, 7],1表示星期一
    – isocalendar():返回一个元组,格式为:(year, weekday, isoweekday)
    – isoformat():返回 ‘YYYY-MM-DD’ 格式的日期字符串
    – strftime(format):返回指定格式的日期字符串,与time模块的strftime(format, struct_time)功能相同
# 交互模式:
>>> t = datetime.date.today()
>>> t
datetime.date(2019, 12, 6)
>>> t.year
2019
>>> t.timetuple()
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=6, tm_hour=0, tm_min=0, tm_sec
=0, tm_wday=4, tm_yday=340, tm_isdst=-1)
>>> t.toordinal()
737399
>>> t.weekday()
4
>>> t.strftime('%Y%m%d')
'20191206'
>>> t.strftime('%Y-%m-%d')
'2019-12-06'

datetime.datetime:

  • datetime类是前述time和date类的合体
  • class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
# 交互模式下:
>>> a = datetime.datetime.now()
>>> a
datetime.datetime(2019, 12, 6, 15, 40, 39, 242713)
>>> a.date()
datetime.date(2019, 12, 6)
>>> a.time()
datetime.time(15, 40, 39, 242713)
>>> a.utctimetuple()
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=6, tm_hour=15, tm_min=40, tm_s
ec=39, tm_wday=4, tm_yday=340, tm_isdst=0)

>>> datetime.datetime.strptime('2019-12-06 15:42:20', '%Y-%m-%d %H:%M:%S')
datetime.datetime(2019, 12, 6, 15, 42, 20)
>>> a.timestamp()
1575618039.242713
>>> print(datetime.datetime.fromtimestamp(a.timestamp()))
2019-12-06 15:40:39.242713

datetime.timedelta:

  • timedelta可以方便实现时刻(delta实例、time实例、datetime实例)之间的加减运算。
  • class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)
# 交互模式:
>>> delta_h = datetime.timedelta(hours=2)
>>> delta_h
datetime.timedelta(seconds=7200)
>>> str(delta_h)
'2:00:00'
>>> delta_d = datetime.timedelta(days=1)
>>> str(delta_d)
'1 day, 0:00:00'
>>> today = datetime.date.today()
>>> today
datetime.date(2019, 12, 6)
>>> yesterday = today - delta_d
>>> yesterday
datetime.date(2019, 12, 5)
>>> tomorrow = today + delta_d
>>> tomorrow
datetime.date(2019, 12, 7)
>>> tomorrow - yesterday
datetime.timedelta(days=2)
>>> work = datetime.timedelta(hours=8)
>>> meeting = datetime.timedelta(hours=1)
>>> meeting / work
0.125

练习:

  • 例题1:计算上周一和周日的日期
# 交互模式下:
>>> import datetime
>>> today = datetime.date.today() # 获取今天的日期
>>> today_weekday = today.isoweekday() # 获取今天星期几 [1, 7]
>>> today_weekday
5
>>> last_sunday = today - datetime.timedelta(days=today_weekday) # 今天减去几天(星期几就是几天),获取上周日日期
>>> last_sunday
datetime.date(2019, 12, 1)
>>> last_monday = last_sunday - datetime.timedelta(days=6) # 上周日减去6天就是上周一
>>> last_monday
datetime.date(2019, 11, 25)
三、课程小结
  • 学习了calendar
  • 学习了time
  • 学习了datetime
四、作业
  • 计算指定日期当月最后一天的日期和该月天数

小编参考:

import calendar
import datetime

today = datetime.date.today()     # 获取今天日期
m_range = calendar.monthrange(today.year, today.month) 
month_days = m_range[1]           # 获取这个月份的天数
print('本月最后一天的日期:{0}-{1}-{2}'.format(today.year, today.month, month_days))
print('本月的天数:', month_days)

运行结果:
在这里插入图片描述

你可能感兴趣的:(Python全栈工程师学习笔记)