python datetime模組
from datetime import datetime #匯入
now = datetime.now() #獲取當前日期和時間,型別是datetime
dt = datetime(2015, 4, 19, 12, 20)
dt.timestamp() #datetime轉換為timestamp
timestamp就是相對於epoch time的秒數,它的值與時區沒有關係,而datetime與時區有關,計算機儲存的當前時間是以timestamp表示的,任何計算機在任意時刻的timestamp都是完全相同的
datetime.fromtimestamp(t) #timestamp轉換為datetime
datetime.utcfromtimestamp(t) #timestamp轉換為UTC標準時區的datetime
datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S') #str轉datetime
now = datetime.now()
now.strftime('%a, %b %d %H:%M') #datetime轉str
now = datetime.now()
now + timedelta(hours=10)
now - timedelta(days=1) #datetime加減操作
本地時間轉換為UTC時間
本地時間是指系統設定時區的時間,例如北京時間是UTC+8:00時區的時間,而UTC時間指UTC+0:00時區的時間。
>>> from datetime import datetime, timedelta, timezone >>> tz_utc_8 = timezone(timedelta(hours=8)) # 建立時區UTC+8:00 >>> now = datetime.now() >>> now datetime.datetime(2015, 5, 18, 17, 2, 10, 871012) >>> dt = now.replace(tzinfo=tz_utc_8) # 強制設定為UTC+8:00 >>> dt datetime.datetime(2015, 5, 18, 17, 2, 10, 871012, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
時區轉換
我們可以先通過utcnow()
拿到當前的UTC時間,再轉換為任意時區的時間
# 拿到UTC時間,並強制設定時區為UTC+0:00:
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
>>> print(utc_dt)
2015-05-18 09:05:12.377316+00:00
# astimezone()將轉換時區為北京時間:
>>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(bj_dt)
2015-05-18 17:05:12.377316+08:00
# astimezone()將轉換時區為東京時間:
>>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt)
2015-05-18 18:05:12.377316+09:00
# astimezone()將bj_dt轉換時區為東京時間:
>>> tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt2)
2015-05-18 18:05:12.377316+09:00
練習
假設你獲取了使用者輸入的日期和時間如2015-1-21 9:01:30
,以及一個時區資訊如UTC+5:00
,均是str
,請編寫一個函式將其轉換為timestamp
# 假設你獲取了使用者輸入的日期和時間如2015-1-21 9:01:30,以及一個時區資訊如UTC+5:00,均是str,請編寫一個函式將其轉換為timestamp
import re
from datetime import datetime, timezone, timedelta
def to_timestamp(dt_str, tz_str):
localTime = datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S')
nowTimeZone = int(re.match(r'UTC([+-]\d+):\d+',tz_str).groups()[0])
tz_utc_now = timezone(timedelta(hours=nowTimeZone))
dt = localTime.replace(tzinfo=tz_utc_now)
return dt.timestamp()
t1 = to_timestamp('2015-6-1 08:10:30', 'UTC+7:00')
assert t1 == 1433121030.0, t1
t2 = to_timestamp('2015-5-31 16:10:30', 'UTC-09:00')
assert t2 == 1433121030.0, t2
print('ok')