python時間和日期


轉自:https://www.cnblogs.com/fengfenggirl/archive/2013/05/20/python_time.html

 

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].
%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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM