Python 提供了兩個(gè)標(biāo)準(zhǔn)庫(kù)用于處理跟時(shí)間相關(guān)的問(wèn)題,一個(gè)是 time,另一個(gè)是 datetime,datetime 對(duì) time 進(jìn)行了封裝,提供了更多實(shí)用的函數(shù)。本文介紹 datetime 庫(kù)的簡(jiǎn)單使用。
獲取當(dāng)前時(shí)間可以使用 now() 或 utcnow() 方法,其中,now() 用于獲取當(dāng)?shù)貢r(shí)間,而 utcnow() 用于獲取 UTC 時(shí)間。
>>> from datetime import datetime
>>> datetime.now() # 返回一個(gè) datetime 對(duì)象,這里是當(dāng)?shù)貢r(shí)間
datetime.datetime(2016, 12, 10, 11, 32, 43, 806970)
>>> datetime.utcnow() # 返回一個(gè) datetime 對(duì)象,這里是 UTC 時(shí)間
datetime.datetime(2016, 12, 10, 3, 32, 49, 999423)
>>> datetime.now().year, datetime.now().month, datetime.now().day # 年月日
(2016, 12, 10)
>>> datetime.now().hour, datetime.now().minute, datetime.now().second # 時(shí)分秒
(11, 35, 37)
有時(shí),我們需要對(duì)時(shí)間做格式化處理,可以使用 strftime() 或 strptime() 方法,其中,strftime 用于對(duì) datetime 對(duì)象進(jìn)行格式化,strptime 用于對(duì)字符串對(duì)象進(jìn)行格式化。
>>> from datetime import datetime
# 獲取當(dāng)前當(dāng)?shù)貢r(shí)間
>>> now = datetime.now()
>>> now
datetime.datetime(2016, 12, 10, 11, 46, 24, 432168)
# 對(duì) datetime 對(duì)象進(jìn)行格式化,轉(zhuǎn)為字符串格式
>>> now_str = now.strftime('%Y-%m-%d %H:%M:%S.%f')
>>> now_str
'2016-12-10 11:46:24.432168'
# 對(duì)字符串對(duì)象進(jìn)行格式化,轉(zhuǎn)為 datetime 對(duì)象
>>> datetime.strptime(now_str, '%Y-%m-%d %H:%M:%S.%f')
datetime.datetime(2016, 12, 10, 11, 46, 24, 432168)
Unix 時(shí)間戳根據(jù)精度的不同,有 10 位(秒級(jí)),13 位(毫秒級(jí)),16 位(微妙級(jí))和 19 位(納秒級(jí))。
要注意的是,由于每個(gè)時(shí)區(qū)都有自己的本地時(shí)間(北京在東八區(qū)),因此也產(chǎn)生了世界標(biāo)準(zhǔn)時(shí)間(UTC, Universal Time Coordinated)。所以,在將一個(gè)時(shí)間戳轉(zhuǎn)換為普通時(shí)間(比如 2016-01-01 12:00:00)時(shí),要注意是要本地時(shí)區(qū)的時(shí)間還是世界時(shí)間等。
>>> import time
>>> from datetime import datetime
# 獲取當(dāng)前當(dāng)?shù)貢r(shí)間,返回一個(gè) datetime 對(duì)象
>>> now = datetime.now()
>>> now
datetime.datetime(2016, 12, 9, 11, 56, 47, 632778)
# 13 位的毫秒時(shí)間戳
>>> long(time.mktime(now.timetuple()) * 1000.0 + now.microsecond / 1000.0)
1481255807632L
# 10 位的時(shí)間戳
>>> int(time.mktime(now.timetuple()))
1481255807
>>> import calendar
>>> from datetime import datetime
# 獲取當(dāng)前的 UTC 時(shí)間,返回 datetime 對(duì)象
>>> utc_now = datetime.utcnow()
>>> utc_now
datetime.datetime(2016, 12, 9, 4, 0, 53, 356641)
# 13 位的時(shí)間戳
>>> long(calendar.timegm(utc_now.timetuple()) * 1000.0 + utc_now.microsecond / 1000.0)
1481256053356L
# 10 位的時(shí)間戳
>>> calendar.timegm(utc_now.timetuple())
1481256053
>>> from datetime import datetime
# 13 位的毫秒時(shí)間戳
>>> timestamp = 1456402864242
# 根據(jù)時(shí)間戳構(gòu)建當(dāng)?shù)貢r(shí)間
>>> datetime.fromtimestamp(timestamp / 1000.0).strftime('%Y-%m-%d %H:%M:%S.%f')
'2016-02-25 20:21:04.242000'
# 根據(jù)時(shí)間戳構(gòu)建 UTC 時(shí)間
>>> datetime.utcfromtimestamp(timestamp / 1000.0).strftime('%Y-%m-%d %H:%M:%S.%f')
'2016-02-25 12:21:04.242000'
# 10 位的時(shí)間戳
>>> timestamp = 1456402864
# 根據(jù)時(shí)間戳構(gòu)建當(dāng)?shù)貢r(shí)間
>>> datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
'2016-02-25 20:21:04'
# 根據(jù)時(shí)間戳構(gòu)建 UTC 時(shí)間
>>> datetime.utcfromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
'2016-02-25 12:21:04'
>>> from datetime import datetime
# 13 位的毫秒時(shí)間戳
>>> timestamp = 1456402864242
# 根據(jù)時(shí)間戳構(gòu)建當(dāng)?shù)貢r(shí)間
>>> datetime.fromtimestamp(timestamp / 1000.0)
datetime.datetime(2016, 2, 25, 20, 21, 4, 242000)
# 根據(jù)時(shí)間戳構(gòu)建 UTC 時(shí)間
>>> datetime.utcfromtimestamp(timestamp / 1000.0)
datetime.datetime(2016, 2, 25, 12, 21, 4, 242000)
# 10 位的時(shí)間戳
>>> timestamp = 1456402864
# 根據(jù)時(shí)間戳構(gòu)建當(dāng)?shù)貢r(shí)間
>>> datetime.fromtimestamp(timestamp)
datetime.datetime(2016, 2, 25, 20, 21, 4)
# 根據(jù)時(shí)間戳構(gòu)建 UTC 時(shí)間
>>> datetime.utcfromtimestamp(timestamp)
datetime.datetime(2016, 2, 25, 12, 21, 4)