砂拉豆 发表于 2015-4-22 10:27:46

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
一个月的第一天,取值范围: .
20


%H
24小时制的小时,取值范围.
17


%I
12小时制的小时,取值范围 .
10


%j
一年中的第几天,取值范围 .
120


%m
十进制月份,取值范围.
50


%M
分钟,取值范围 .
50


%p
上、下午,AM 或 PM.
PM


%S
秒,取值范围 .
30


%U
这一年的星期数(星期天为一个星期的第一天,开年的第一个星期天之前的天记到第0个星期)趋势范围.
20


%w
星期的十进制表示,取值范围 .
1


%W
这一年的星期数(星一为一个星期的第一天,开年的第一个星期一之前的天记到第0个星期)趋势范围.
20


%x
特定自然语言下的日期表示
05/20/13


%X
特定自然语言下的时间表示
16:00:02


%y
年的后两位数,取值范围.
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
sleep0
1369040510.93 0.02
sleep1
1369040511.93 0.02
sleep2
1369040513.94 0.02
sleep3
1369040516.94 0.02
sleep4
  注:在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
12345
6789 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
secondweek = c
thirdweek = c
if firstweek:#如果第0个星期有星期二,第1个星期二就该开会
meetingdate = secondweek
else:
meetingdate = thirdweek
print '%5s: %2s' % (calendar.month_abbr,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
  
页: [1]
查看完整版本: python之日期和时间