datetime 是 Python 處理日期和時間的標準庫。
獲取當前日期和時間
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 內建模塊—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
# 獲取當前datetime:
now = datetime.now()
print(now)
print(type(now))
注意: datetime 是模塊,datetime 模塊還包含一個 datetime 類,通過 from datetime import datetime 導入的纔是 datetime 這個類。
如果僅導入 import datetime,則必須引用全名 datetime.datetime。
datetime.now() 返回當前日期和時間,其類型是 datetime。
獲取指定日期和時間
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 內建模塊—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
t = datetime(2020,5,20,13,14)
print(t)
datetime 轉換爲 timestamp
在計算機中,時間實際上是用數字表示的。我們把 1970 年 1 月 1 日 00:00:00 UTC+00:00 時區的時刻稱爲 epoch time ,記爲 0(1970年以前的時間timestamp爲負數),當前時間就是相對於 epoch time 的秒數,稱爲timestamp。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 內建模塊—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
t = datetime(2020,5,20,13,14)
print(t.timestamp())
注意: Python 的 timestamp 是一個浮點數。如果有小數位,小數位表示毫秒數。
timestamp 轉換爲 datetime
使用 datetime 提供的 fromtimestamp() 方法:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 內建模塊—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
t = 1589951640.0
print(datetime.fromtimestamp(t)) # 本地時間
print(datetime.utcfromtimestamp(t)) # UTC時間
注意: timestamp 是一個浮點數,它沒有時區的概念,而 datetime 是有時區的。
str 轉換爲 datetime
使用 datetime 提供的 strptime() 方法:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 內建模塊—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
day = datetime.strptime('2020-5-20 13:14:00','%Y-%m-%d %H:%M:%S')
print(day)
注意: 轉換後的 datetime 是沒有時區信息的。
datetime 轉換爲 str
轉換方法是通過 strftime() 實現:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 內建模塊—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
now = datetime.now()
print(now.strftime('%a, %b %d %H:%M'))
datetime 加減
需要導入 timedelta 這個類,使用 timedelta 你可以很容易地算出前幾天和後幾天的時刻。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 內建模塊—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime, timedelta
cday = datetime.strptime('2020-5-20 13:14:00', '%Y-%m-%d %H:%M:%S')
print('current datetime =', cday)
print('current + 10 hours =', cday + timedelta(hours=10))
print('current - 1 day =', cday - timedelta(days=1))
print('current + 2.5 days =', cday + timedelta(days=2, hours=12))
本地時間轉換爲 UTC 時間
本地時間是指系統設定時區的時間,例如北京時間是 UTC+8:00 時區的時間,而UTC時間指 UTC+0:00 時區的時間。
時區轉換的關鍵在於,拿到一個 datetime 時,要獲知其正確的時區,然後強制設置時區,作爲基準時間。
利用帶時區的 datetime,通過 astimezone() 方法,可以轉換到任意時區。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 內建模塊—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime, timedelta, timezone
utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
utc8_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
print('UTC+0:00 now =', utc_dt)
print('UTC+8:00 now =', utc8_dt)
注意:不是必須從 UTC+0:00 時區轉換到其他時區,任何帶時區的 datetime 都可以正確轉換。
小結
datetime 表示的時間需要時區信息才能確定一個特定的時間,否則只能視爲本地時間。
如果要存儲 datetime,最佳方法是將其轉換爲 timestamp 再存儲,因爲 timestamp 的值與時區完全無關。