Python时间与⽇期操作(datetime、time、calendar)相关模块
模块说明
time time是⼀个仅包含与⽇期和时间相关的函数和常量的模块,在本模块中定义了C/C++编写的⼏个类。例如,struct_time类datetime datetime是⼀个使⽤⾯向对象编程设计的模块,可以在Python中使⽤⽇期和时间。它定义了⼏个表⽰⽇期和时间的类calendar⽇历是⼀个提供函数的模块,以及与Calendar相关的⼏个类,它们⽀持将⽇历映像⽣成为text,html,….
locale该模块包含⽤于格式化或基于区域设置分析⽇期和时间的函数。
UTC(CoordinatedUniversal Time,世界协调时)亦即格林威治天⽂时间,世界标准时间。在中国为UTC+8。
DST(DaylightSaving Time)即夏令时。是⼀种为节约能源⽽⼈为规定地⽅时间的制度,⼀般在天亮早的夏季⼈为将时间提前⼀⼩时
时间元组
Python时间函数将时间处理为9个数字的元组,各个索引所代表的字段及取值范围如下所⽰:
索引字段值
04位数,表⽰年份2018,2019…
1⽉份 1 ~ 12
2⽇期 1 ~ 31
3⼩时0 ~ 23
4分钟0 ~ 59
5秒0 ~ 61(60或61是闰秒)
6星期⼏0 ~ 6(0是星期⼀)
7⼀年的第⼏天 1 ~ 366(朱利安⽇)
8夏令时1,0,1,-1是决定是否为夏令时的旗帜
1 year (four digits, e.g. 2018)
2 month (1-12)
3 day (1-31)
4 hours (0-23)
5 minutes (0-59)
6 seconds (0-59)
7 weekday (0-6, Monday is 0)
8 Julian day (day in the year, 1-366)
9#夏令时格式,0:正常格式,1:夏令时格式,-1:根据当前的⽇期时间格式来判定
10 DST (Daylight Savings Time) flag (-1, 0 or 1)
上⾯的元组相当于struct_time结构。此结构具有以下属性:
索引字段值
0tm_year2018,2019…
1tm_mon 1 ~ 12
2tm_mday 1 ~ 31
3tm_hour0 ~ 23
4tm_min0 ~ 59
5tm_sec0 ~ 61(60或61是闰秒)
6tm_wday0 ~ 6(0是星期⼀)
7tm_yday 1 ~ 366(朱利安⽇)
8tm_isdst1,0,1,-1是决定是否为夏令时的旗帜
可⽤如下图⽰表⽰:
time模块
time模块,它提供了处理时间和表⽰之间转换的功能。help(time)之后可以知道time有2种时间表⽰形式:
1、时间戳表⽰法,即以整型或浮点型表⽰的是⼀个以秒为单位的时间间隔。这个时间的基础值是从1970年的1⽉1号零点开始算起。
2、元组格式表⽰法,这个元组有9个整型内容。分别表⽰不同的时间含义。
编
⽅法描述
号
1time.time()返回当前时间时刻,浮点数形式秒数,不⽀持参数
2time.clock()返回当前程序的cpu执⾏时间。为了测量不同⽅法的计算成本,time.clock的值⽐time.time()的值更有⽤。unix系统始终返回全部运⾏时间;⽽windows从第⼆次开始都是以第⼀次调⽤此函数时的时间戳作为基准
3time.sleep(secs)暂停调⽤线程secs秒,接受整型和浮点型参数。
5time.localtime([secs])将时间戳转换为本地时间元组格式。接受⼀个浮点型时间戳参数,其默认值为当前时间戳。
6time.asctime([tupletime])接受时间元组,并返回⼀个可读的24个字符的字符串,例如’Tue Dec 11 22:07:14 2019’,默认值为localtime()返回值。
8time.mktime(tupletime)将本地时间元组,转换为时间戳(浮点值,该时间点以秒为单位表⽰。)。接受⼀个时间元组,必选。
9time.strftime(fmt[,tupletime])将时间元组以指定的格式(字符串fmt指定)转换为字符串形式。接受字符串格式化串、时间元组。时间元组为可选,默认为localtime()
10time.strptime(str,fmt="")根据格式字符串fmt解析str,并返回元组格式的时间。
strftime()的逆向过程。接受字符串,时间格式2个参数,都是必选
11time.altzone本地DST时区的偏移量(以秒为单位的UTC)。
时间字符串⽀持的格式符号:
1格式含义备注
2 %a 本地(locale)简化星期名称
3 %A 本地完整星期名称
4 %b 本地简化⽉份名称
5 %B 本地完整⽉份名称
6 %c 本地相应的⽇期和时间表⽰
7 %d ⼀个⽉中的第⼏天(01 - 31)
8 %H ⼀天中的第⼏个⼩时(24⼩时制,00 - 23)
9 %I 第⼏个⼩时(12⼩时制,01 - 12)
10 %j ⼀年中的第⼏天(001 - 366)
11 %m ⽉份(01 - 12)
12 %M 分钟数(00 - 59)
13 %p 本地am或者pm的相应符
14 %S 秒(01 - 61)
15 %U ⼀年中的星期数。(00 - 53星期天是⼀个星期的开始。)第⼀个星期天之前的所有天数都放在第0周。
16 %w ⼀个星期中的第⼏天(0 - 6,0是星期天)
17 %W 和%U基本相同,不同的是%W以星期⼀为⼀个星期的开始。
18 %x 本地相应⽇期
19 %X 本地相应时间
20 %y 去掉世纪的年份(00 – 99)
21 %Y 完整的年份
22 %Z 时区的名字(如果不存在为空字符)
23 %% ‘%’字符
注意:
1、“%p”只有与“%I”配合使⽤才有效果。
2、⽂档中强调确实是0-61,⽽不是59,闰年秒占两秒
3、当使⽤strptime()函数时,只有当在这年中的周数和天数被确定的时候%和%W才会被计算
time模块重要属性
序号属性说明
1time.timezone UTC和本地时区(不含DST)之间的偏移量,以秒计
3time.altzone当地夏令时时间与标准UTC时间的误差,以秒计
4time.daylight当地时间是否反映夏令时,默认为0
time模块实例
1import time
2
3 ticks = time.time()
4
5# 这种格式不能表⽰在时代(1970年1⽉1⽇上午12:00)之前的⽇期。只能表⽰之后⽇期并且截⽌点为3038年的某个时刻,在未来的⽇⼦也不能以这种⽅式表⽰
6print("Number of ticks since 12:00am, January 1, 1970:", ticks)
7
8# 获取当前本地时间
9 localtime =time.localtime(time.time())
10print("Local current time :", localtime)
11
12# 当前时间格式化
13 curtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
14print(curtime)
15# 也可以使⽤asctime()进⾏时间格式化
16print(time.asctime(localtime))
结果:
Number of ticks since 12:00am, January 1, 1970: 1541039190.1566076
Local current time : time.struct_time(tm_year=2018, tm_mon=11, tm_mday=1, tm_hour=10, tm_min=26, tm_sec=30, tm_wday=3, tm_yday=305, tm_isdst=0)
2018-11-01 10:26:30
Thu Nov 1 10:26:30 2018
Calendar模块
calendar模块提供与⽇历相关的功能,包括为给定的⽉份或年份打印⽂本⽇历的功能。
默认情况下,⽇历将星期⼀作为⼀周的第⼀天,将星期⽇作为最后⼀天。如果想要更改这个,可调⽤calendar.setfirstweekday()函数设置修改。以下是calendar模块可⽤的功能函数列表
序
号
函数描述
1Calendar(year,w = 2,l = 1,c
= 6)
返回⼀个具有年份⽇历的多⾏字符串格式化为三列,以c个空格分隔。 w是每个⽇期的字符宽度;每⾏的长度为21 * w + 18
+ 2 * c,l是每周的⾏数。
2firstweekday( )返回当前设置每周开始的星期。默认情况下,当⽇历⾸次导⼊时设置为:0,表⽰为星期⼀。3isleap(year)如果给定年份(year)是闰年则返回True;否则返回:False。
4leapdays(y1,y2)返回在范围(y1,y2)内的年份中的闰年总数。
5Month(year,month,w = 2,l =
1)
返回⼀个多⾏字符串,其中包含年份⽉份的⽇历,每周⼀⾏和两个标题⾏。 w是每个⽇期的字符宽度;每⾏的长度为7 * w
+ 6。 l是每周的⾏数
6Monthcalendar(year,month)返回int类型的列表。每个⼦列表表⽰⼀个星期。年份⽉份以外的天数设置为0;该⽉内的⽇期设定为⽉份的第⼏⽇:1 ~ 31 7Monthrange(year,month)返回两个整数。第⼀个是年度⽉(month)的星期⼏的代码;第⼆个是当⽉的天数。表⽰星期⼏为0(星期⼀)⾄6(星期⽇);⽉份是1到12
8Prcal(year,w = 2,l = 1,c = 6)类似于:calendar.calendar(year,w,l,c)的打印
9Prmonth(year,month,w = 2,l
= 1)类似于:h(year,month,w,l)的打印
10setfirstweekday(weekday)将每周的第⼀天设置为星期⼏的代码。星期⼏的代码为0(星期⼀)⾄6(星期⽇)。
11timegm(ime的倒数:以时间元组的形式接受时刻,并返回与从时代(epoch)开始的浮点数相同的时刻。12weekday(year,month,day)返回给定⽇期的星期⼏的代码。星期⼏的代码为0(星期⼀)⾄6(星期⽇);⽉数是1(1⽉)到12(12⽉)。
calendar模块实例
1import calendar
2
3# 获取⼀个⽉的⽇历
4 cal = h(2018, 10);
5print("Here is the calendar:");
6print(cal);
结果:
Here is the calendar:
October 2018
unix时间戳转换日期格式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
datetime模块
datetime是Python处理⽇期和时间的标准库。需要注意的是,datetime是⼀个模块,这个模块⾥⾯有datetime类,此外常⽤的还有date类,以及time类。
datetime模块使⽤实例:
1from datetime import date
2from datetime import datetime
3from datetime import timedelta
4
5# 计算两个⽇期相差多少天
6 d1 = date(2018, 10, 18);
7 d2 = date(2017, 12, 31);
8
9print("(2018, 10, 18)与(2017, 12, 31)相差:", (d1 - d2).days, "天!");
10
11# 获取两个⽇期时间的时间差
12 time1 = datetime(2019, 1, 13, 12, 0, 0);
13 time2 = w();
14 differtime = (time1 -time2).total_seconds();
15print("(2019,1,13,12,0,0)与当前时间相差:", differtime, "秒!");# 输出结果
16
17# 当前⽇期
18 curdate = day();
19print("curdate =",curdate);
20
21# 计算⼗天之后的⽇期时间
22 nowday = w();
23# timedelta类可以很容易地算出前⼏天和后⼏天的时刻。(timedelta(days= d, hours= h))
24# 还可以查看第⼏周对应的时间,例如:timedelta(weeks=20) 20周将被⾃动转化为天数
25# 前⼏天时刻,⽤减法。后⼏天时刻,则⽤当前时间加上timedelta(days = d, hours= h)
26 lastday = nowday + timedelta(days=10);
27print(str(lastday));
ime());# ctime() 返回⼀个表⽰⽇期和时间的字符串。
29
30# 查看某⼀天是今年的第⼏天和第⼏周
31 testday = date(2017, 8, 31);
32print(testday.isocalendar());# isocalendar() 函数返回三元组分别为:年份,周数,周⼏
33print(testday.timetuple());# timetuple() 返回时间元祖
结果:
(2018, 10, 18)与(2017, 12, 31)相差: 291 天!
(2019,1,13,12,0,0)与当前时间相差: 6311998.358155 秒!
curdate = 2018-11-01
2018-11-11 10:40:01.641845
Sun Nov 11 10:40:01 2018
(2017, 35, 4)
time.struct_time(tm_year=2017, tm_mon=8, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=243, tm_isdst=-1)
其他程序实例:计算程序运⾏时间
1# 统计程序运⾏时间的程序
2import time
3# datetime是⼀个模块,模块⾥⾯有⼀个datetime类,所以可以from datetime importdatetime
4import datetime
5
6# ⽅法⼀(性能最差)
7 starttime = w()
8 time.sleep(2)
9 endtime = w()
10print((endtime - starttime).seconds)
11
12# ⽅法⼆
13 start = time.time()
14 time.sleep(2)
15 end = time.time()
16print(end- start)
17
18# ⽅法1和⽅法2都包含了其他程序使⽤CPU的时间,是程序开始到程序结束的运⾏时间。
19
20# 推荐⽅法3 (只计算了程序运⾏的CPU时间)
21 first = time.clock()
22 time.sleep(2)
23 second = time.clock();
24print(second- first)
25
26
27# 要实现跨平台的精度性,也可以使⽤timeit 来代替time.
28import timeit
29
30 starttime2 = timeit.default_timer()
31 time.sleep(2)
32 endtime2 = timeit.default_timer() 33print(str(endtime2 - starttime2))结果:
2
2.0009114742279053
2.0007298604141965
2.000633781133109
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论