1. 程式人生 > >python 學習筆記 13 -- 經常使用的時間模塊之time

python 學習筆記 13 -- 經常使用的時間模塊之time

分鐘 英文 超過 最好 還原 %x tracking 運動 文檔

Python 沒有包括相應日期和時間的內置類型。只是提供了3個相應的模塊,能夠採用多種表示管理日期和時間值:

* time 模塊由底層C庫提供與時間相關的函數。它包括一些函數用於獲取時鐘時間和處理器的執行時間,還提供了基本解析和字符串格式化工具
* datetime 模塊為日期、時間以及日期時間值提供一個更高層接口。

datetime 中的類支持算術、比較和時區配置


* calendar 模塊能夠創建周、月和年的格式化表示

還能夠用來計算反復事件、給定日期是星期幾,以及其它基於日歷的值




time - 時鐘時間模塊。

我們使用apihelper.info(能夠參考系列前面文章Python 學習筆記 9 -- Python強大的自省簡析查看time 類,能夠得知time 模塊主要有下面方法:


1. time

核心函數。返回值是以浮點數計的自紀元開始以來的秒數。用於比較或者計算還是比較方便。


2. ctime

假設你想打印日期或者時間信息,使用 ctime 要比time 更加方便:

>>> time.ctime()
‘Tue Jul 8 15:26:21 2014‘

我們能夠看到 ctime 返回的是可讀的可直接用於記錄時間的字符串形式時間

信息。


我們還能夠使用 ctime 來格式化打印一個由 time 計算的時間值
>>> print "Now time is :",time.ctime() ; later = time.time()+15 ; print "15 secs later :", time.ctime(later)
結果是:
Now time is : Tue Jul 8 15:28:54 2014
15 secs later : Tue Jul 8 15:29:09 2014

3. clock

處理器時鐘,能夠用來計算程序使用的實際時間。評估性能。

>>> print 123456789*123456789/987654, time.clock()
15432103500 0.08
>>> print 123456789*123456789/987654321, time.clock()
15432098 0.09
>>> print (123456789*123456789+ 1234567890/987654321)*123456, time.clock()
1881664346183521084032 0.11

>>> print (123456789*123456789+ 1234567890/987654321)*123456, time.clock() # 與上面相同復雜的運算,放在主頻比較低的樹莓派上執行。cpu 耗時要長非常多
1881664346183521084032 3.49


4. gmtime, localtime 和tzset

先統一介紹一下這幾個函數(後面結合實例會了解的更加清楚):

time.gmtime([secs]) --參數為一個以秒表示的時間值,gmtime 函數將參數轉化並返回一個 struct_time 結構(見本文最後一節)的時間信息gmtime轉化得到的時間是UTC 時間(世界統一時間)。假設沒有使用一個秒數作為參數,將會默認使用並轉化當前時間(即time.time()), 所以直接使用 time.gmtime() 會得到當前UTC 時間,效果同 time.gmtime(time.time())。


time.localtime([secs]) -- 函數使用以及作用都與gmtime 類似,可是轉化的結果是本地時間。也就是說它轉化的結果是符合當前設置的時區信息的本地時間。

相同,假設沒有參數,默認轉化的也是當前時間(即time.time()),所以直接使用 time.localtime() 會得到當前的本地時間。效果同 time.localtime(time.time())。

time.tzset() -- 設置時區從而改變了上面兩個函數的時間轉化的規則



而對於 時區的選擇。我們能夠查看參考Linux 的 "/usr/share/zoneinfo/" 文件夾:

$ ls /usr/share/zoneinfo/
Africa Australia Cuba Etc GMT0 Iceland Japan MST Poland right UCT zone.tab
America Brazil EET Europe GMT-0 Indian Kwajalein MST7MDT Portugal ROC Universal Zulu
Antarctica Canada Egypt Factory GMT+0 Iran Libya Navajo posix ROK US
Arctic CET Eire GB Greenwich iso3166.tab localtime NZ posixrules Singapore UTC
Asia Chile EST GB-Eire Hongkong Israel MET NZ-CHAT PRC SystemV WET
Atlantic CST6CDT EST5EDT GMT HST Jamaica Mexico Pacific PST8PDT Turkey W-SU
此外,對於時區的劃分以及使用我可能解釋不清,並且也不想占用此篇文章的篇幅。想了解的請點這裏


你須要理解的是:

UTC 指的是Coordinated Universal Time- 世界協調時間(又稱世界標準時間、世界統一時間)。是經過平均太陽時(以格林威治時間GMT為準)、地軸運動修正後的新時標以及以「秒」為單位的國際原子時所綜合精算而成的時間,計算過程相當嚴謹精密。
中國一般使用CST 時間。解釋為“China Standard Time UT+8:00” ,即標準的UTC 時間加8


對於時區的設置以及localtime 顯示的信息:

>>> time.gmtime() # 直接使用,默認轉化當前時間time.time()並返回 struct_time 結構的 UTC 時間
time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=1, tm_min=56, tm_sec=28, tm_wday=2, tm_yday=190, tm_isdst=0)
>>> time.localtime() # 返回當前的本地時間
time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=9, tm_min=56, tm_sec=32, tm_wday=2, tm_yday=190, tm_isdst=0)
>>> os.environ[‘TZ‘] = ‘Brazil/East‘ # 既然在世界杯期間,最好還是設置看看巴西時間
>>> time.tzset() # 設置時區
>>> time.gmtime() # 我們能夠看到設置時區後對UTC 時間並無幹擾
time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=1, tm_min=57, tm_sec=42, tm_wday=2, tm_yday=190, tm_isdst=0)
>>> time.localtime() # 本地時間已經顯示的不同了,由於當前輸出的是巴西時間
time.struct_time(tm_year=2014, tm_mon=7, tm_mday=8, tm_hour=22, tm_min=57, tm_sec=49, tm_wday=1, tm_yday=189, tm_isdst=0)
>>> os.environ[‘TZ‘] = ‘Asia/Shanghai‘ #又一次設置時區為上海(好像沒有北京時間,安裝Linux 時小夥伴應該都註意過這個問題。

)。回到北京時間
>>> time.tzset()
>>> time.gmtime()
time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=1, tm_min=58, tm_sec=7, tm_wday=2, tm_yday=190, tm_isdst=0)
>>> time.localtime()
time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=9, tm_min=58, tm_sec=10, tm_wday=2, tm_yday=190, tm_isdst=0)
>>> time.tzname # 中國的時區名為 CST。理解為“China Standard Time UT+8:00”
(‘CST‘, ‘CST‘)


5. strptime 和 strftime

這兩個函數用來解析和格式化輸出時間。用作字符串格式的時間與 struct_time 結構的時間之間的轉化。



對於上面的localtime ,我們能夠看到輸出結果是一個 struct_time 結構體並以元組格式打印。我們能夠使用" time.localtime().tm_year " 這樣單獨取當中一項

所以我們打印日期時能夠這樣:

>>> print "%s-%s-%s" % (time.localtime().tm_year, time.localtime().tm_mon, time.localtime().tm_mday)
2014-7-8

而ctime 輸出的結果是字符串形式, 對於這樣的的我們能夠使用這兩個函數來解析/格式化:


strftime 用於將元組轉化為字符串, 它將指定的struct_time(默覺得當前時間),依據指定的格式化字符串輸出。
>>> time.localtime() # 我們能夠知道,localtime 打印的結果是元組形式的時間結構體

time.struct_time(tm_year=2014, tm_mon=7, tm_mday=8, tm_hour=16, tm_min=13, tm_sec=9, tm_wday=1, tm_yday=189, tm_isdst=0)

>>> time.strftime(‘%Y-%m-%d %H:%M:%S‘, time.localtime()) # 使用格式化打印,我們能夠看到比上面使用元組項要方便非常多

‘2014-07-08 16:13:10‘


strptime 用於將字符串格式的格式化為元組
>>> time.ctime()
‘Tue Jul 8 16:16:32 2014‘
>>> time.strptime(time.ctime())
time.struct_time(tm_year=2014, tm_mon=7, tm_mday=8, tm_hour=16, tm_min=16, tm_sec=45, tm_wday=1, tm_yday=189, tm_isdst=-1)
>>> time.strftime( ‘%Y-%m-%d %H:%M:%S‘, time.strptime(time.ctime())) # 格式化之後我們再使用strftime 格式化打印成我們想要的格式就非常方便了。!!
‘2014-07-08 16:17:29‘


time.strftime 的使用格式為:
strftime(format[, tuple])
裏面有非常多參數。可以讓你可以更任意的輸出自己想要的東西
%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 當前時區的名稱
%% %號本身


6. sleep

休眠函數, 不論什麽語言中基本上都會有休眠函數,而python 中相應的就是 time.sleep(n)。

攜帶的參數指定掛起運行程序的秒數。

為了更精確休眠的時間參數能夠是一個浮點數。實際的掛起時間可能小於請求的數,由於捕獲其它信號會終止休眠並運行信號相應的捕獲程序。掛起時間也有可能比要求的更長。由於可能會調度系統中的其它活動。


7. mktime

這是 localtime 的逆函數。它的參數是 struct_time 結構或者完整的9 元素的元組(假設使用元組,須要dst 標識。假設不知能夠使用-1)。為了兼容time(),它會返回一個浮點數。假設參數不能被表示為一個有效的時間。會引發OverflowError 或者 ValueError錯誤。
>>> t = time.time()
>>> t
1404867269.117389
>>> time.localtime(t) # 上面已說過,使用time.localtime 能夠將time() 生成的浮點數轉化為 struct_time 結構
time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=8, tm_min=54, tm_sec=29, tm_wday=2, tm_yday=190, tm_isdst=0)
>>> time.mktime(time.localtime(t))
1404867269.0 # 我們能夠看到time.mktime 將 struct_time 結構再次還原為浮點數,當中由於 struct_time 結構中最小值為 tm_sec。也就是說最小時間精度為秒。所以使用 mktime 得到的浮點數中。秒下面的數(毫秒。微秒)被抹去

>>> time.mktime( (2014, 7, 9, 8, 54, 29, 2, 190, -1) ) # 使用上面結構體中的數(dst使用-1表示未知)組成的9元素的元組,mktime 可以還原出相同的值
1404867269.0


8. struct_time 結構

最後介紹一下 time.struct_time 類:
time 的gmtime(), localtime(), 以及 strptime()方法獲取的時間值類型是一個struct_time 類它是一個命名的元組對象:元素能夠通過index獲取,或者是通過屬性名稱

>>> time.localtime()
time.struct_time(tm_year=2014, tm_mon=7, tm_mday=8, tm_hour=22, tm_min=9, tm_sec=1, tm_wday=1, tm_yday=189, tm_isdst=0)
>>> time.localtime()[1]
7
>>> time.localtime().tm_mon
7

眼下這個結構中有下面元素:


time.struct_time 結構
0 tm_year (for example, 1993)(下註
1 tm_mon range [1, 12](下註
2 tm_mday range [1, 31]
3 tm_hour range [0, 23]
4 tm_min range [0, 59]
5 tm_sec range [0, 61](下註
6 tm_wday range [0, 6], Monday is 0
7 tm_yday range [1, 366]
8 tm_isdst 0, 1 or -1; see below













假設在函數中使用該元組時使用了錯誤的長度或者使用錯誤的類型。會引發TypeError 錯誤。

註:

上面表中,tm_sec 中的取值範圍為 0~61。 這並非寫錯了!是考慮了閏秒和雙閏秒的因素(很少見)。(關於閏秒,英文leap seconds,這是來自百度百科的解釋: 閏秒是指為保持協調世界時接近於世界時時刻,由國際計量局統一規定在年底或年中對協調世界時添加或降低1秒>的調整。因為地球自轉的不均勻性和長期變慢性。會使世界時(民用時)和原子時之間相差超過到±0.9秒時。就把世界時向前撥1秒(負閏秒,最後一分鐘為59秒)或向後撥1秒(正閏秒,最後一分鐘為61秒))

與C 結構不同。月相應的值範圍是1~12,而不是0~11。

年的值須要註意下面問題:Python 依賴於平臺的C 庫。C 庫通常是沒有2000年的問題的,由於全部的日期和時間都內在的代表自時代以來的秒。函數接收上面一個struct_time 結構,當中須要4位來表示年。

為了向後兼容。假設模塊變量accept2dyear 是一個非零整數,支持使用2位來表示年;而這個變量會被初始化為1,除非環境變量PYTHONY2K 被設置為一個非空的字符串。之後PYTHONY2K 被設置時變量 accept2dyear 才會被初始化為0。


因此,你能夠將PYTHONY2K 設置為一個非空字符串從而使得python 對於不論什麽年的輸入都使用4位來表示。

否則。假設使用的是2位表示年,將會依據POSIX 或者X/Open 標準來轉換:69~99 被映射為1969~1999,而0~68 被映射為2000~2068。(此問題在Python的 time模塊介紹中標記為“Year 2000 (Y2K) issues” )



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

註:本文僅僅介紹了 time 模塊,其它的時間模塊還有 datetime 和calendar 迫於篇幅限制(排版過於繁瑣),以及電腦配置限制(AMD速龍+2G內存。即使跑的Linux太長的文章上下翻動感覺頁非常卡)將於本系列以下兩篇介紹。

很多其它關於 time 模塊的相關內容請參考

">Python 官方文檔

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

註: 轉載註明出處: http://blog.csdn.net/longerzone

python 學習筆記 13 -- 經常使用的時間模塊之time