Python 中提供了對時間日期的多種多樣的處理方式,主要是在 time 和 datetime 這兩個模組裡。今天稍微梳理一下這兩個模組在使用上的一些區別和聯絡。
Python表示時間的兩種方式:
1. 時間戳(相對於1970.1.1 00:00:00以秒計算的偏移量),時間戳是惟一的
2. 時間元組 即(struct_time),共有九個元素,分別表示,同一個時間戳的struct_time會因為時區不同而不同。
struct_time元組共有9個元素,分別含義如下:
tm_year(年) 四位數字,如:2017
tm_mon(月) 1 - 12
tm_mday(日) 1 - 31
tm_hour(時) 0 - 23
tm_min(分) 0 - 59
tm_sec(秒) 0 - 61
tm_wday(weekday) 0 - 6(0表示週日)
tm_yday(一年中的第幾天) 1 - 366
tm_isdst(是否是夏令時) 預設為-1
time
在 Python 文件裡,time是歸類在Generic Operating System Services中,換句話說, 它提供的功能是更加接近於作業系統層面的。通讀文件可知,time 模組是圍繞著 Unix Timestamp 進行的。
該模組主要包括一個類 struct_time,另外其他幾個函式及相關常量。 需要注意的是在該模組中的大多數函式是呼叫了所在平臺C library的同名函式, 所以要特別注意有些函式是平臺相關的(如:time.clock()),可能會在不同的平臺有不同的效果。另外一點是,由於是基於Unix Timestamp,所以其所能表述的日期範圍被限定在 1970 - 2038 之間,如果你寫的程式碼需要處理在前面所述範圍之外的日期,那可能需要考慮使用datetime模組更好。
常用方法:
1. time.sleep(secs) #推遲指定的時間(secs)後繼續執行
2. time.localtime([secs]) #將一個時間戳轉換成一個當前時區的struct_time,如果seconds引數未輸入,則以當前時間為轉換標準
未提供secs引數時,按當前時間為準
3. time.strftime(format[, t]) #將指定的struct_time(預設為當前時間),根據指定的格式化字串輸出
4. time.time() #返回當前時間的時間戳
5. time.mktime(t) #將一個struct_time轉換為時間戳,如下time.localtime接收一個時間戳返回一個struct_time,而time.mktime接收一個struct_time,返回一個時間戳
6. time.gmtime([secs]) #和localtime()方法類似,gmtime()方法是將一個時間戳轉換為UTC時區(0時區)的struct_time
7. time.clock() #這個需要注意,在不同的系統上含義不同。 在UNIX系統上,它返回的是“程式時間”,它是用秒錶示的浮點數(時間戳)。而在WINDOWS中,第一次呼叫,返回的是程式執行的實際時間。而第二次 之後的呼叫是自第一次呼叫以後到現在的執行時間。(實際上是以WIN32上QueryPerformanceCounter()為基礎,它比毫秒錶示更為 精確)
8. time.asctime([t]) #把一個表示時間的元組或者struct_time表示為這種形式:'Sun Jun 20 23:21:05 1993'。如果沒有引數,將會將time.localtime()作為引數傳入
9. time.ctime([secs]):把一個時間戳(按秒計算的浮點數)轉化為time.asctime()的形式。如果引數未給或者為None的時候,將會預設time.time()為引數。它的作用相當於time.asctime(time.localtime(secs))
10. time.strftime(format[, t]) #把一個代表時間的元組或者struct_time(如由time.localtime()和time.gmtime()返回)轉化為格式化的時間字串。 如果t未指定,將傳入time.localtime()。如果元組中任何一個元素越界,ValueError的錯誤將會被丟擲
程式碼例項:
>>> import time
使用time模組,首先得到當前的時間戳
>>> time.time() 1513855961.782587
將時間戳轉換為時間元組 struct_time
>>> time.localtime(time.time()) time.struct_time(tm_year=2017, tm_mon=12, tm_mday=21, tm_hour=19, tm_min=33, tm_sec=17, tm_wday=3, tm_yday=355, tm_isdst=0)
格式化輸出想要的時間
>>> time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) '2017-12-21 19:33:40'
接上文,不加引數時,預設就是輸出當前的時間
>>> time.strftime('%Y-%m-%d %H:%M:%S') '2017-12-21 19:33:53'
使用的時候需要注意一下使用的時區。
datetime
datetime 比 time 高階了不少,可以理解為 datetime 基於 time 進行了封裝,提供了更多實用的函式。在datetime 模組中包含了幾個類,具體如下:
timedelta # 主要用於計算時間跨度
tzinfo # 時區相關
time # 只關注時間
date # 只關注日期
datetime # 同時有時間和日期
在實際實用中,用得比較多的是 datetime.datetime 和 datetime.timedelta ,另外兩個 datetime.date 和 datetime.time 實際使用和 datetime.datetime 並無太大差別。 對於一個 datetime.datetime 例項,主要會有以下屬性及常用方法:
datetime.year
datetime.month
datetime.day
datetime.hour
datetime.minute
datetime.second
datetime.microsecond
datetime.tzinfo #時區
datetime.date() # 返回 date 物件
datetime.time() # 返回 time 物件
datetime.replace(name=value) # 前面所述各項屬性是 read-only 的,需要此方法才可更改
datetime.timetuple() # 返回time.struct_time 物件
dattime.strftime(format) # 按照 format 進行格式化輸出
除了例項本身具有的方法,類本身也提供了很多好用的方法:
datetime.today()a # 當前時間,localtime
datetime.now([tz]) # 當前時間預設 localtime
datetime.utcnow() # UTC 時間
datetime.fromtimestamp(timestamp[, tz]) # 由 Unix Timestamp 構建物件
datetime.strptime(date_string, format) # 給定時間格式解析字串
...
請注意,上面省略了很多和時區相關的函式,如需使用請查文件。對於日期的計算,使用timedelta也算是比較簡單的:
>>> import datetime >>> time_now = datetime.datetime.now() >>> time_now datetime.datetime(2017, 12, 21, 19, 35, 59, 129648) >>> time_now.strftime('%Y-%m-%d %H:%M:%S') '2017-12-21 19:35:59' >>> delta = datetime.timedelta(hours=24) >>> print(time_now + delta) 2017-12-22 19:35:59.129648 >>> print(time_now - delta) 2014-10-26 20:46:16.657523 >>> print(time_now - delta) 2017-12-20 19:35:59.129648