python之日期和时间
1、时钟时间--time
time提供了很多管理时钟时间的函数,如
1)获取以秒为单位的浮点时间time():
>>> import time >>> print time.time()#获取当前时间的浮点值,单位为秒 1369031293.33 >>>
2)获取人可以直观理解的时间ctime():
>>> print time.ctime() Mon May 20 14:29:30 2013#获取人能理解的直观时间
3)浮点时间转化为直观时间:
>>> t = time.time()#浮点时间 >>> print t 1369034676.69 >>> print time.ctime(t)#浮点时间转化为直观时间 Mon May 20 15:24:36 2013
4)ctime()到time(),直观时间到浮点时间的直接转化,我在python的标准库中没有找到。但经过一步中间转化strptime()为UTC时间后,可以转化为浮点时间,建议先看到9)再回来看,这样会比较容易理解。
>>> t = time.time()#浮点时间 >>> ct = time.ctime(t)#浮点转化为直观时间 >>> gmt = time.strptime(ct)#直观时间转化为UTC时间 >>> tt = time.mktime(gmt)#UTC时间转化为浮点值时间 >>> print t,tt 1369035200.01 1369035200.0
注意:浮点时间t先转化为直观时间ct,再转化为浮点时间tt,发现tt的精度降低了。因为直观时间只能精确到秒,所以从浮点时间t先转化为直观时间ct,小数点后面的毫秒就已经丢失了。
5)获取格林尼治时间UTC(Coordinated Universal Time,协调时间)格式:
>>> print time.gmtime()#获取UTC格式的当前时间 time.struct_time(tm_year=2013, tm_mon=5, tm_mday=20, tm_hour=6, tm_min=37, tm_sec=45, tm_wday=0, tm_yday=140, tm_isdst=0)
一个UTC格式的时间有9项目,最后一个tm_isdst表示是否是夏时令时间
6)获取当前时区的当前时间localtime()
>>> print time.localtime()#获取当前时区的当前时间 time.struct_time(tm_year=2013, tm_mon=5, tm_mday=20, tm_hour=14, tm_min=45, tm_sec=24, tm_wday=0, tm_yday=140, tm_isdst=0)
7)解析UTC格式时间:
import time def show_timestruct(t): print '年:',t.tm_year print '月:',t.tm_mon print '日:',t.tm_mday print '小时:',t.tm_hour print '分钟',t.tm_min print '秒',t.tm_sec print '星期:',t.tm_wday print '一年的第 %s 天' % t.tm_yday print '是否夏时令:',t.tm_isdst if __name__ == "__main__": t = time.gmtime() show_timestruct(t) >>> 年: 2013 月: 5 日: 20 小时: 7 分钟 9 秒 50 星期: 0 一年的第 140 天 是否夏时令: 0
8)将UTC格式的时间转化为浮点值的时间:
>>> gmt = time.gmtime()#UTC格式的时间 >>> print gmt time.struct_time(tm_year=2013, tm_mon=5, tm_mday=20, tm_hour=6, tm_min=48, tm_sec=13, tm_wday=0, tm_yday=140, tm_isdst=0) >>> print time.mktime(gmt)#将UTC格式的时间转化为浮点值的时间 1369003693.0 >>> lt = time.localtime()#将UTC格式当前时区当前时间 >>> print lt time.struct_time(tm_year=2013, tm_mon=5, tm_mday=20, tm_hour=14, tm_min=49, tm_sec=25, tm_wday=0, tm_yday=140, tm_isdst=0) >>> print time.mktime(lt)##将UTC格式的时间转化为浮点值的时间 1369032565.0
9)将浮点值的时间转化为UTC格式的时间:
>>> t = time.time()#浮点时间 >>> print time.gmtime(t)#将浮点值的时间转化为UTC格式的时间: time.struct_time(tm_year=2013, tm_mon=5, tm_mday=20, tm_hour=6, tm_min=57, tm_sec=58, tm_wday=0, tm_yday=140, tm_isdst=0) >>> print time.localtime(t)#将浮点值的时间转化为UTC格式当前时区时间: time.struct_time(tm_year=2013, tm_mon=5, tm_mday=20, tm_hour=14, tm_min=57, tm_sec=58, tm_wday=0, tm_yday=140, tm_isdst=0) >>>
三类时间格式之间的转换如下:
10)格式化日期:
>>> lt = time.localtime()#UTC格式当前时区时间 >>> st = time.strftime("%b %d %a %H:%M:%S %Y %s",lt)格式化时间 >>> print st May 20 Mon 15:54:34 2013 1369036474
具体的参数如下表,翻译源自:python官方文档
标识 | 含义 | 举例 |
%a | 星期简写 | Mon |
%A | 星期全称 | Monday |
%b | 月份简写 | Mar |
%B | 月份全称 | March |
%c | 适合语言下的时间表示 | May Mon May 20 16:00:02 2013 |
%d | 一个月的第一天,取值范围: [01,31]. | 20 |
%H | 24小时制的小时,取值范围[00,23]. | 17 |
%I | 12小时制的小时,取值范围 [01,12]. | 10 |
%j | 一年中的第几天,取值范围 [001,366]. | 120 |
%m | 十进制月份,取值范围[01,12]. | 50 |
%M | 分钟,取值范围 [00,59]. | 50 |
%p | 上、下午,AM 或 PM. | PM |
%S | 秒,取值范围 [00,61]. | 30 |
%U | 这一年的星期数(星期天为一个星期的第一天,开年的第一个星期天之前的天记到第0个星期)趋势范围[00,53]. | 20 |
%w | 星期的十进制表示,取值范围 [0(星期天),6]. | 1 |
%W | 这一年的星期数(星一为一个星期的第一天,开年的第一个星期一之前的天记到第0个星期)趋势范围[00,53]. | 20 |
%x | 特定自然语言下的日期表示 | 05/20/13 |
%X | 特定自然语言下的时间表示 | 16:00:02 |
%y | 年的后两位数,取值范围[00,99]. | 13 |
%Y | 完整的年 | 2013 |
%Z | 时区名 | CST(China Standard Time) |
%% | %字符 | % |
11)CPU时钟时间clock(),它反映了程序运行的实际时间,使用它做性能测试更准确
import time for i in range(5): print time.time(),'\t',time.clock() a = i*3.14 for j in range(4000000): a += j-i
在ubuntu中的输出为下:
>>> 1369040214.11 0.01 1369040214.97 0.87 1369040215.76 1.67 1369040216.56 2.46
当程序休眠时,CPU不工作,time.clock()的值不会增加(具体与操作系统有关):
import time for i in range(5): print time.time(),time.clock() print "sleep ",i time.sleep(i)
在Ubuntu下输出结果为:
1369040510.93 0.02 sleep 0 1369040510.93 0.02 sleep 1 1369040511.93 0.02 sleep 2 1369040513.94 0.02 sleep 3 1369040516.94 0.02 sleep 4
注:在windows下面time.clock()的值会增加
2 、日期和时间管理--datetime
1)datetime中中的时间由time表示:可以用datetime.time()直接构造时间,不过参数必须在指定范围内:
>>> import datetime >>> print datetime.time(18,20,56)#构造时间 18:20:56 >>> print datetime.time.min,datetime.time.max,datetime.time.resolution 00:00:00 23:59:59.999999 0:00:00.000001
2)日期由date表示,today()可以获得今天的日期,其中的年、月、日都可以替换
>>> d = datetime.date(1998,2,5)#构造日期 >>> d datetime.date(1998, 2, 5) #日期最小值,最大值,精度 >>> print datetime.date.min,datetime.date.max,datetime.date.resolution 0001-01-01 9999-12-31 1 day, 0:00:00 >>> today = datetime.date.today()#生成今天的日期 >>> print today 2013-05-20 >>> print today.replace(day=19)#替换日 2013-05-19 >>> print today.replace(month=3)#替换月 2013-03-20 >>> print today.replace(year=2003)#替换年 2003-05-20
3)时间段datedelta,datedelta可以表示星期、日、小时、分钟、秒、毫秒、微秒:
>>> print datetime.timedelta(weeks=1)#一个星期 7 days, 0:00:00 >>> print datetime.timedelta(days=1)#一天 1 day, 0:00:00 >>> print datetime.timedelta(hours=1)#一小时 1:00:00 >>> print datetime.timedelta(minutes=1)#1分钟 0:01:00 >>> print datetime.timedelta(seconds=1)#一秒 0:00:01 >>> print datetime.timedelta(milliseconds=1)#一毫秒 0:00:00.001000 >>> print datetime.timedelta(microseconds=1)#一微秒 0:00:00.000001
注意timedelta的内部值是用日、秒、微秒存储。
>>> delta = datetime.timedelta(weeks=1,days=1,hours=1,minutes=1,seconds=1,milliseconds=1,microseconds=1) >>> delta datetime.timedelta(8, 3661, 1001)
利用时间段可以很方便的进行时间和日期运算:
>>> today = datetime.date.today() >>> print '今天:',today 今天: 2013-05-20 >>> oneday = datetime.timedelta(days=1)#一天 >>> yesterday = today - oneday#昨天 >>> print '昨天:',yesterday 昨天: 2013-05-19 >>> tomorrow = today + oneday#明天 >>> print "明天:",tomorrow 明天: 2013-05-21 >>> print tomorrow - yesterday#时间作差 2 days, 0:00:00 >>> print yesterday - tomorrow -2 days, 0:00:00
4)时间、时间段可以比较大小,这里不详细介绍。
5)日期和时间结合,datetime中的datetime,即datetime.datetime存储了时间和日期
>>> print '现在:',datetime.datetime.now() 现在: 2013-05-20 19:36:36.385627 >>> print '今天:',datetime.datetime.today() 今天: 2013-05-20 19:37:15.515159 >>> print 'UTC:',datetime.datetime.utcnow() UTC: 2013-05-20 11:37:54.000763
上面创建的datetime实例都可以用getattr()解析:
#解析时间 import datetime now = datetime.datetime.now() items = ['year','month','day','hour','minute','second','microsecond'] for attr in items: print '%12s: %s' % (attr,getattr(now,attr))
输出结果:
>>> year: 2013 month: 5 day: 20 hour: 19 minute: 44 second: 41 microsecond: 466798
可以使用date和time结合成一个datetime
>>> t = datetime.time(20,1,4)#赖你一世 >>> d = datetime.date.today()#赖你一生吾赖你 >>> dt = datetime.datetime.combine(d,t) >>> print dt 2013-05-20 20:01:04
3、Calendar处理日期,管理面向年、月、周的时间。
Calendar定义了三个类Calendar、TextCalendar和HTMLCalendar
利用TextCalendar的prmonth()可以生成一个格式化的日历
c = calendar.TextCalendar(calendar.SUNDAY) >>> c.prmonth(2012,5) May 2012 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
利用HTMLCalendar和formatmonth()也可以生成这样的日历,只是有一些HTML标签,保存成HTML,在浏览器下打开就可以看到了
HTMLCalendar在处理一些重复性日期时比较方便,假设公司每个月第二周的周二要开一次会议,现在要计算今天这一年开会的日期:
import calendar for month in range(1,13):#遍历每个月份 c = calendar.monthcalendar(2013,month) firstweek = c[0] secondweek = c[1] thirdweek = c[2] if firstweek[calendar.TUESDAY]:#如果第0个星期有星期二,第1个星期二就该开会 meetingdate = secondweek[calendar.TUESDAY] else: meetingdate = thirdweek[calendar.TUESDAY] print '%5s: %2s' % (calendar.month_abbr[month],meetingdate)
输出的开会日期是:
>>>
Jan: 8 Feb: 12 Mar: 12 Apr: 9 May: 14 Jun: 11 Jul: 9 Aug: 13 Sep: 10 Oct: 8 Nov: 12 Dec: 10
补充,字符串时间转成数值型时间
将"2011-09-28 10:00:00"转化为时间戳
time.mktime(time.strptime(a,'%Y-%m-%d %H:%M:%S')) >>1317091800.0