Python中time和datetime的區別與聯絡

pythontab發表於2017-12-21

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


相關文章