1. 程式人生 > >Python 時間處理

Python 時間處理

一、簡介

time模組提供各種操作時間的函式
說明:一般有兩種表示時間的方式:
第一種是時間戳的方式(相對於1970.1.1 00:00:00以秒計算的偏移量),時間戳是惟一的
第二種以陣列的形式表示即(struct_time),共有九個元素,分別表示,同一個時間戳的struct_time會因為時區不同而不同

year (four digits, e.g. 1998)
month (1-12)
day (1-31)
hours (0-23)
minutes (0-59)
seconds (0-59)
weekday (0-6, Monday is 0)
Julian day (day in the year, 1-366)
DST (Daylight Savings Time) flag (-1, 0 or 1) 是否是夏令時
If the DST flag is 0, the time is given in the regular time zone;
if it is 1, the time is given in the DST time zone;
if it is -1, mktime() should guess based on the date and time.

二、函式介紹
1.asctime()
asctime([tuple]) -> string
將一個struct_time(預設為當時時間),轉換成字串
Convert a time tuple to a string, e.g. ‘Sat Jun 06 16:26:11 1998′.
When the time tuple is not present, current time as returned by localtime()
is used.

2.clock()
clock() -> floating point number
該函式有兩個功能,
在第一次呼叫的時候,返回的是程式執行的實際時間;
以第二次之後的呼叫,返回的是自第一次呼叫後,到這次呼叫的時間間隔

  1. import time  
  2. if __name__ == '__main__':  
  3.     time.sleep(1)  
  4.     print"clock1:%s" % time.clock()  
  5.     time.sleep(1)  
  6.     print"clock2:%s" % time.clock()  
  7.     time.sleep(1)  
  8.     print"clock3:%s" % time.clock()  

輸出:
clock1:3.35238137808e-006
clock2:1.00004944763
clock3:2.00012040636
其中第一個clock輸出的是程式執行時間
第二、三個clock輸出的都是與第一個clock的時間間隔

3.sleep(…)
sleep(seconds)
執行緒推遲指定的時間執行,經過測試,單位為秒,但是在幫助文件中有以下這樣一句話,這關是看不懂
“The argument may be a floating point number for subsecond precision.”

4.ctime(…)
ctime(seconds) -> string
將一個時間戳(預設為當前時間)轉換成一個時間字串
例如:

  time.ctime()輸出為:’Sat Mar 28 22:24:24 2009′

5.gmtime(…)
gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,tm_sec, tm_wday, tm_yday, tm_isdst)
將一個時間戳轉換成一個UTC時區(0時區)的struct_time,如果seconds引數未輸入,則以當前時間為轉換標準

6.localtime(…)
localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)
將一個時間戳轉換成一個當前時區的struct_time,如果seconds引數未輸入,則以當前時間為轉換標準

7.mktime(…)
mktime(tuple) -> floating point number
將一個以struct_time轉換為時間戳

8.strftime(…)
strftime(format[, tuple]) -> string
將指定的struct_time(預設為當前時間),根據指定的格式化字串輸出
python中時間日期格式化符號:
%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%m 月份(01-12)
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%M 分鐘數(00=59)
%S 秒(00-59)

%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(00-53)星期一為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱
%% %號本身

9.strptime(…)
strptime(string, format) -> struct_time
將時間字串根據指定的格式化符轉換成陣列形式的時間
例如:
2009-03-20 11:45:39 對應的格式化字串為:%Y-%m-%d %H:%M:%S
Sat Mar 28 22:24:24 2009 對應的格式化字串為:%a %b %d %H:%M:%S %Y

10.time(…)
time() -> floating point number
返回當前時間的時間戳

三、疑點
1.夏令時
在struct_time中,夏令時好像沒有用,例如
a = (2009, 6, 28, 23, 8, 34, 5, 87, 1)
b = (2009, 6, 28, 23, 8, 34, 5, 87, 0)
a和b分別表示的是夏令時和標準時間,它們之間轉換為時間戳應該相關3600,但是轉換後輸出都為646585714.0

四、小應用
1.python獲取當前時間
time.time() 獲取當前時間戳
time.localtime() 當前時間的struct_time形式
time.ctime() 當前時間的字串形式

2.python格式化字串
格式化成2009-03-20 11:45:39形式

  time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())格式化成Sat Mar 28 22:24:24 2009形式

  time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())3.將格式字串轉換為時間戳

  a = "Sat Mar 28 22:24:24 2009"
  b = time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))

python time datetime模組詳解
Time模組:
--------------------------
time() #以浮點形式返回自Linux新世紀以來經過的秒數。在linux中,00:00:00 UTC,

January 1, 1970是新**49**的開始。
>>> time.time()
1150269086.6630149
>>> time.ctime(1150269086.6630149)
>>> 'Wed Jun 14 15:11:26 2006'

time.ctime([sec])#把秒數轉換成日期格式,如果不帶引數,則顯示當前的時間。

>>> import time
>>> time.ctime()
>>> 'Wed Jun 14 15:02:50 2006'
>>> time.ctime(1138068452427683)
'Sat Dec 14 04:51:44 1901'
>>> time.ctime(os.path.getmtime('E:\\untitleds.bmp'))
'Fri Sep 19 16:35:37 2008'

>>> time.gmtime(os.path.getmtime('E:\\untitleds.bmp'))
time.struct_time(tm_year=2008, tm_mon=9, tm_mday=19, tm_hour=8, tm_min=35,

tm_sec=37, tm_wday=4, tm_yday=263, tm_isdst=0)

將一個檔案的修改時間轉換為日期格式(秒 轉 日期)
>>> time.strftime('%Y-%m-%d %X',time.localtime(os.path.getmtime('E:\\untitleds.bmp')))
'2008-09-19 16:35:37'

#定時3秒。
>>> time.sleep(3)

TIME模組參考:
---------------------------------
#取一個檔案的修改時間
>>> os.path.getmtime('E:\\untitleds.bmp')
1221813337.7626641

變數
timezone 通用協調時間和本地標準時間的差值,以秒為單位。
altzone 通用協調時間和本地夏令時的差值
daylight 標誌,本地時間是否反映夏令時。
tzname (標準時區名,夏令時時區名)
函式
time() 以浮點數返回紀元至今以來的秒數。
clock() 以浮點數返回CPU開始這個process的時間,(或者至上次呼叫這個函式的時間)
sleep() 延遲一段以浮點數表示的秒數。
gmtime() 把以秒錶示的時間轉換為通用協調時序列
localtime() 把秒時轉換為本地時序列
asctime() 將時間序列轉換成文字描述
ctime() 將秒時轉換成文字描述
mktime() 將本地時序列轉換成秒時
strftime() 以指定格式將序列時轉為文字描述
strptime() 以指定格式從文字描述中解析出時間序列
tzset() 改變當地時區值

DateTime模組
----------------------------
datetime 將日期轉化為秒
-------------------------------------
>>> import datetime,time
>>> time.mktime(datetime.datetime(2009,1,1).timetuple())
1230739200.0

>>> cc=[2000,11,3,12,43,33] #Attributes: year, month, day, hour, minute,

second
>>> time.mktime(datetime.datetime(cc[0],cc[1],cc[2],cc[3],cc[4],cc[5]).timetuple())
973226613.0

將秒轉換為日期格式
>>> cc = time.localtime(os.path.getmtime('E:\\untitleds.bmp'))
>>> print cc[0:3]
(2008, 9, 19)

DateTime示例
-----------------
演示計算兩個日期相差天數的計算
>>> import datetime
>>> d1 = datetime.datetime(2005, 2, 16)
>>> d2 = datetime.datetime(2004, 12, 31)
>>> (d1 - d2).days
47

演示計算執行時間的例子,以秒進行顯示
import datetime
starttime = datetime.datetime.now()
#long running
endtime = datetime.datetime.now()
print (endtime - starttime).seconds

演示計算當前時間向後10小時的時間。
>>> d1 = datetime.datetime.now()
>>> d3 = d1 + datetime.timedelta(hours=10)
>>> d3.ctime()

其本上常用的類有:datetime和timedelta兩個。它們之間可以相互加減。每個類都有一些方法和屬性可以檢視具體的值

3)glob
可以使用簡單的方法匹配某個目錄下的所有子目錄或檔案,用法也很簡單。
3.1 glob.glob(regression) 返回一個列表
3.2 glob.iglob(regression) 返回一個遍歷器
這個模組簡單好用,強力推薦。

---------------------------------------------------------

使用datetime模組計算兩個時間的差:

>>> import datetime
>>> d1=datetime.datetime(2010,9,8)
>>> d2=datetime.datetime(2005,8,12)
>>>(d1-d2).days
1853

That means  我這個blog開博至今已經5年28天啦!

計算執行時間的例子,以秒進行顯示:

import datetime
starttime = datetime.datetime.now()
#long running
endtime = datetime.datetime.now()
print (endtime - starttime).seconds

計算當前時間向後10小時的時間:

>>> d1 = datetime.datetime.now()
>>> d3 = d1 + datetime.timedelta(hours=10)
>>> d3.ctime()

其本上常用的類有:datetime和timedelta兩個。它們之間可以相互加減。每個類都有一些方法和屬性可以檢視具體的值,如datetime可以檢視:天數(day),小時數(hour),星期幾(weekday())等;timedelta可以檢視:天數(days),秒數(seconds) 等。

===================================

日期的操作必須使用time或datetime庫

import time
>>> s="2006-1-2"
>>> time.strptime(s,"%Y-%m-%d)
這是將字串格式的日期及時間轉成日期物件
轉義符對應意義如下
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%j 年內的一天(001-366)
%m 月份(01-12)
%M 分鐘數(00=59)
%p 本地A.M.或P.M.的等價符
%S 秒(00-59)
%U 一年中的星期數(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(00-53)星期一為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%Z 當前時區的名稱
%% %號本身

================舉例的分隔線====================

  1. #-*- coding:utf-8 -*-
  2. import time  
  3. import datetime  
  4. # time , datetime , string 型別互相轉換
  5. #
  6. # string -> time
  7. # time.strptime(publishDate,"%Y-%m-%d %H:%M:%S")
  8. #
  9. # time -> string
  10. # time.strftime("%y-%m-%d",t)
  11. date = '2007-01-01'
  12. print type(date)  
  13. date = time.strptime(date,"%Y-%m-%d")  
  14. print type(date)  
  15. print date[0]  
  16. d4 = datetime.datetime(date[0], date[1],date[2])  
  17. print d4  
  18. print type(d4)  
  19. #將日期時間物件轉成字串則要用
  20. date = time.strftime("%y-%m-%d",date)  
  21. print type(date)  
  22. #其中date為日期時間物件


==============我編輯的一個通用的時間計算小程式 ================

  1. # -*- coding:GBK -*-
  2. # 計算兩個時間的間隔天數
  3. # 注意:輸入月份和天時,不能輸入08,09等,會被識別為 8 進位制而出錯!(8進位制是不超過07的)
  4. # 解決辦法:要把月份和天前面的0去掉。
  5. from datetime import datetime  
  6. (y1,m1,d1) = input("請輸入時間1(格式為2009,8,9):")  
  7. (y2,m2,d2) = input("請輸入時間2:")  
  8. date1 = datetime(y1,m1,d1)  
  9. date2 = datetime(y2,m2,d2)  
  10. days = (date2-date1).days  
  11. if (days<0):  # 如果時間相差為負數,取為正數
  12.     days = -days  
  13. if (days>365):  
  14.     print'兩個時間相隔',days/365,'年',days%365,'天'
  15. else:  
  16.     print'兩個時間相隔',days,'天!'