标准库:一些最爱
time
time模块所包含的函数能够实现以下功能:
获取当前时间、操作系统时间和日期、从字符串读取时间以及格式化时间为字符串。
日期可以用实数(从“新纪元”的1月1日0点开始计算到现在的秒数,新纪元是一个与平台相关的年份,对unix来说是1970年),或者是包含有9个整数的元组。
日期元组的字段含义
如元组:
(2008,1,21,12,2,56,0,21,0)
表示2008年1月21日12时2分56秒,星期一,且是当年的第21天(无夏令时)。
索引 |
字段 |
值 |
0 |
年 |
比如2000,2001,等等 |
1 |
月 |
1~12 |
2 |
日 |
1~31 |
3 |
时 |
0~23 |
4 |
分 |
0~59 |
5 |
秒 |
0~61 |
6 |
周 |
当周一为0时,范围0~6 |
7 |
儒历日 |
范围1~366 |
8 |
夏令时 |
0、1或-1 |
秒的范围是0~61是为了应付闰秒和双闰秒。夏令时的数字是布尔值(真或假),但如果使用了-1,mktime就会工作正常。
重要的函数
函数 |
描述 |
asctime([tuple]) |
将时间元组转换为字符串 |
localtime([secs]) |
将秒数转换为日期元组,以本地时间为准 |
mktime(tuple) |
将时间元组转换为本地时间 |
sleep(secs) |
休眠(不做任何事情)secs秒 |
strptime(string[,format]) |
将字符串解析为时间元组 |
time() |
当前时间(新纪元开始后的秒数,以UTC为准) |
>>> import time
>>> time.asctime()
‘Thu Jun 26 14:34:03 2014‘
获得全球统一时间:
>>> time.gmtime()
time.struct_time(tm_year=2014, tm_mon=6, tm_mday=26, tm_hour=6, tm_min=38, tm_sec=42, tm_wday=3, tm_yday=177, tm_isdst=0)
time.mktime函数与time.localtime功能相反;
time.time使用自新纪元开始计算的秒数返回当前(全球统一)时间,尽管每个平台的新纪元可能不同,但可以通过记录某事件(如函数调用)发生前后time的结果来对该事件计时,然后计算差值。
练习 获取当前时间
脚本内容
$ cat time-example-1.py
#File : time-example-1.py
import time
now=time.time()
print now,"seconds since",time.gmtime(0)[:6]
print "or in other words:"
print "- local time:",time.localtime(now)
print "- utc:",time.gmtime(now)
执行结果
$ python time-example-1.py
1403765543.77 seconds since (1970, 1, 1, 0, 0, 0)
or in other words:
- local time: (2014, 6, 26, 14, 52, 23, 3, 177, 0)
- utc: (2014, 6, 26, 6, 52, 23, 3, 177, 0)
练习 格式化日期和时间
脚本内容
$ cat time-example-2.py
#File : time-example-2.py
import time
now=time.localtime(time.time())
print time.asctime(now)
print time.strftime("%y%m%d %H:%M",now)
print time.strftime("%a %b %d",now)
print time.strftime("%c",now)
print time.strftime("%I %p",now)
print time.strftime("%Y-%m-%d %H:%M:%S %Z",now)
# do it by hand ...
year,month,day,hour,minute,second,weekday,yearday,daylight=now
print "%04d-%02d-%02d" %(year,month,day)
print "%02d:%02d:%02d" %(hour,minute,second)
print ("MON","TUE","WED","THU","FRI","SAT","SUN")[weekday],yearday
执行结果
$ python time-example-2.py
Thu Jun 26 15:01:47 2014
140626 15:01
Thu Jun 26
Thu Jun 26 15:01:47 2014
03 PM
2014-06-26 15:01:47 CST
2014-06-26
15:01:47
THU 177
练习 使用time.strptime解析日期和时间
脚本内容
$ cat time-example-6.py
#File : time-example-6.py
import time
try:
strptime=time.strptime
except AttributeError:
from strptime import strptime
print strptime("30 Nov 00","%d %b %y")
print strptime("1 Jan 70 1:30pm","%d %b %y %I:%M%p")
执行结果
$ python time-example-6.py
time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=13, tm_min=30, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=-1)
练习 把本地时间对转换为时间整型
脚本内容
$ cat time-example-3.py
#File : time-example-3.py
import time
to=time.time()
tm=time.localtime(to)
print tm
print to
print time.mktime(tm)
执行结果
time.struct_time(tm_year=2014, tm_mon=6, tm_mday=26, tm_hour=15, tm_min=11, tm_sec=9, tm_wday=3, tm_yday=177, tm_isdst=0)
1403766669.32
1403766669.0
练习 把UTC时间转换为世界整型
脚本内容
$ cat time-example-4.py
#File : time-example-4.py
import time
def _d(y,m,d,days=(0,31,59,90,120,151,181,212,243,273,304,334,365)):
return (((y-1901)*1461)/4 + days[m-1] + d +
(( m>2 and not y % 4 and (y % 100 or not y % 400)) and 1))
def timegm(tm,epoch=_d(1070,1,1)):
year,month,day,h,m,s=tm[:6]
assert year>=1970
assert 1 <= month <= 12
return (_d(year,month,day) -epoch) * 86400 + h*3600 + m*60 + s
t0=time.time()
tm=time.gmtime(t0)
print tm
print t0
print timegm(tm)
执行结果
$ python time-example-4.py
time.struct_time(tm_year=2014, tm_mon=6, tm_mday=26, tm_hour=7, tm_min=23, tm_sec=22, tm_wday=3, tm_yday=177, tm_isdst=0)
1403767402.91
29805607402
练习 校准算法
脚本内容
$ cat time-example-5.py
#File : time-example-5.py
import time
def procedure():
time.sleep(2.5)
t0=time.clock()
procedure()
print time.clock()-t0,"Seconds process time"
t0=time.time()
procedure()
print time.time()-t0,"seconds wall time"
执行结果
$ python time-example-5.py
0.0 Seconds process time
2.50005602837 seconds wall time