獲取當(dāng)前日期和時間
>>> from datetime import datetime
>>> now = datetime.now() # 獲取當(dāng)前datetime
>>> print(now)
2015-05-18 16:28:07.198690
>>> print(type(now))
<class 'datetime.datetime'>```
注意到datetime是模塊哄褒,datetime模塊還包含一個datetime類厨诸,通過from datetime import datetime導(dǎo)入的才是datetime這個類睁本。如果僅導(dǎo)入import datetime姊氓,則必須引用全名datetime.datetime设江。
datetime.now()返回當(dāng)前日期和時間很泊,其類型是datetime。
要指定某個日期和時間末购,我們直接用參數(shù)構(gòu)造一個datetime:
from datetime import datetime
dt = datetime(2015, 4, 19, 12, 20) # 用指定日期時間創(chuàng)建datetime
print(dt)
2015-04-19 12:20:00```
datetime轉(zhuǎn)換為timestamp
在計算機中预伺,時間實際上是用數(shù)字表示的茫船。我們把1970年1月1日 00:00:00 UTC+00:00時區(qū)的時刻稱為epoch time,記為0(1970年以前的時間timestamp為負(fù)數(shù))扭屁,當(dāng)前時間就是相對于epoch time的秒數(shù),稱為timestamp涩禀。
你可以認(rèn)為:
timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00```
對應(yīng)的北京時間是:
timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00```
可見timestamp的值與時區(qū)毫無關(guān)系料滥,因為timestamp一旦確定,其UTC時間就確定了艾船,轉(zhuǎn)換到任意時區(qū)的時間也是完全確定的葵腹,這就是為什么計算機存儲的當(dāng)前時間是以timestamp表示的,因為全球各地的計算機在任意時刻的timestamp都是完全相同的(假定時間已校準(zhǔn))屿岂。
把一個datetime類型轉(zhuǎn)換為timestamp只需要簡單調(diào)用timestamp()方法:
>>> from datetime import datetime
>>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期時間創(chuàng)建datetime
>>> dt.timestamp() # 把datetime轉(zhuǎn)換為timestamp
1429417200.0```
注意Python的timestamp是一個浮點數(shù)践宴。如果有小數(shù)位,小數(shù)位表示毫秒數(shù)爷怀。
某些編程語言(如Java和JavaScript)的timestamp使用整數(shù)表示毫秒數(shù)阻肩,這種情況下只需要把timestamp除以1000就得到Python的浮點表示方法。
要把timestamp轉(zhuǎn)換為datetime运授,使用datetime提供的fromtimestamp()方法:
from datetime import datetime
t = 1429417200.0
print(datetime.fromtimestamp(t))
2015-04-19 12:20:00```
注意到timestamp是一個浮點數(shù)烤惊,它沒有時區(qū)的概念,而datetime是有時區(qū)的吁朦。上述轉(zhuǎn)換是在timestamp和本地時間做轉(zhuǎn)換柒室。
本地時間是指當(dāng)前操作系統(tǒng)設(shè)定的時區(qū)。例如北京時區(qū)是東8區(qū)逗宜,則本地時間:
2015-04-19 12:20:00
實際上就是UTC+8:00時區(qū)的時間:
2015-04-19 12:20:00 UTC+8:00
而此刻的格林威治標(biāo)準(zhǔn)時間與北京時間差了8小時雄右,也就是UTC+0:00時區(qū)的時間應(yīng)該是:
2015-04-19 04:20:00 UTC+0:00
timestamp也可以直接被轉(zhuǎn)換到UTC標(biāo)準(zhǔn)時區(qū)的時間:
>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t)) # 本地時間
2015-04-19 12:20:00
>>> print(datetime.utcfromtimestamp(t)) # UTC時間
2015-04-19 04:20:00```
>str轉(zhuǎn)換為datetime
轉(zhuǎn)換方法是通過datetime.strptime()實現(xiàn),需要一個日期和時間的格式化字符串:
from datetime import datetime
cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
print(cday)
2015-06-01 18:19:59```
字符串'%Y-%m-%d %H:%M:%S'規(guī)定了日期和時間部分的格式纺讲。注意轉(zhuǎn)換后的datetime是沒有時區(qū)信息的擂仍。
如果已經(jīng)有了datetime對象,要把它格式化為字符串顯示給用戶刻诊,就需要轉(zhuǎn)換為str防楷,轉(zhuǎn)換方法是通過strftime()實現(xiàn)的,同樣需要一個日期和時間的格式化字符串:
>>> from datetime import datetime
>>> now = datetime.now()
>>> print(now.strftime('%a, %b %d %H:%M'))
Mon, May 05 16:28```
>datetime加減
對日期和時間進行加減實際上就是把datetime往后或往前計算则涯,得到新的datetime复局。加減可以直接用+和-運算符冲簿,不過需要導(dǎo)入timedelta這個類:
from datetime import datetime, timedelta
now = datetime.now()
now
datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
now + timedelta(hours=10)
datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
now - timedelta(days=1)
datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
now + timedelta(days=2, hours=12)
datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)```
可見,使用timedelta你可以很容易地算出前幾天和后幾天的時刻亿昏。
時區(qū)轉(zhuǎn)換
一個datetime類型有一個時區(qū)屬性tzinfo峦剔,但是默認(rèn)為None,所以無法區(qū)分這個datetime到底是哪個時區(qū)角钩,除非強行給datetime設(shè)置一個時區(qū):
>>> from datetime import datetime, timedelta, timezone
>>> tz_utc_8 = timezone(timedelta(hours=8)) # 創(chuàng)建時區(qū)UTC+8:00
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012)
>>> dt = now.replace(tzinfo=tz_utc_8) # 強制設(shè)置為UTC+8:00
>>> dt
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))```
如果系統(tǒng)時區(qū)恰好是UTC+8:00吝沫,那么上述代碼就是正確的,否則递礼,不能強制設(shè)置為UTC+8:00時區(qū)惨险。
我們可以先通過utcnow()拿到當(dāng)前的UTC時間,再轉(zhuǎn)換為任意時區(qū)的時間:
拿到UTC時間脊髓,并強制設(shè)置時區(qū)為UTC+0:00:
utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
print(utc_dt)
2015-05-18 09:05:12.377316+00:00
astimezone()將轉(zhuǎn)換時區(qū)為北京時間:
bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
print(bj_dt)
2015-05-18 17:05:12.377316+08:00
astimezone()將轉(zhuǎn)換時區(qū)為東京時間:
tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
print(tokyo_dt)
2015-05-18 18:05:12.377316+09:00
astimezone()將bj_dt轉(zhuǎn)換時區(qū)為東京時間:
tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
print(tokyo_dt2)
2015-05-18 18:05:12.377316+09:00```
時區(qū)轉(zhuǎn)換的關(guān)鍵在于辫愉,拿到一個datetime時,要獲知其正確的時區(qū)将硝,然后強制設(shè)置時區(qū)恭朗,作為基準(zhǔn)時間。
利用帶時區(qū)的datetime依疼,通過astimezone()方法痰腮,可以轉(zhuǎn)換到任意時區(qū)。