48. datetime

獲取當(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ū)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末律罢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子误辑,更是在濱河造成了極大的恐慌虫腋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稀余,死亡現(xiàn)場離奇詭異悦冀,居然都是意外死亡,警方通過查閱死者的電腦和手機睛琳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門盒蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人师骗,你說我怎么就攤上這事历等。” “怎么了辟癌?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵寒屯,是天一觀的道長。 經(jīng)常有香客問我,道長寡夹,這世上最難降的妖魔是什么处面? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮菩掏,結(jié)果婚禮上魂角,老公的妹妹穿的比我還像新娘。我一直安慰自己智绸,他們只是感情好野揪,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞧栗,像睡著了一般斯稳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迹恐,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天平挑,我揣著相機與錄音,去河邊找鬼系草。 笑死,一個胖子當(dāng)著我的面吹牛唆涝,可吹牛的內(nèi)容都是我干的找都。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼廊酣,長吁一口氣:“原來是場噩夢啊……” “哼能耻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亡驰,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晓猛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凡辱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戒职,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年透乾,在試婚紗的時候發(fā)現(xiàn)自己被綠了洪燥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乳乌,死狀恐怖捧韵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汉操,我是刑警寧澤再来,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站磷瘤,受9級特大地震影響芒篷,放射性物質(zhì)發(fā)生泄漏搜变。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一梭伐、第九天 我趴在偏房一處隱蔽的房頂上張望痹雅。 院中可真熱鬧,春花似錦糊识、人聲如沸绩社。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愉耙。三九已至,卻和暖如春拌滋,著一層夾襖步出監(jiān)牢的瞬間朴沿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工败砂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赌渣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓昌犹,卻偏偏與公主長得像坚芜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斜姥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容