1. 程式人生 > >python datetime模組

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')