Python3 日期文本互轉,時間戳,時間差 以及 時區變換

2019-05-25 整理並精簡,歸納出幾種常用日期時間處理方法。
2019-12-16 優化一些表述,更易於理解,方便實際過程中直接使用。

以下基本我在日常寫代碼中,最常用的一些日期相關部分。

1、當前時間轉文本strftime()

無論是timedatetime,哪個模塊都可以,具體怎麼輸出,自行調整格式參數'%Y-%m-%d %H:%M:%S'

%字符 表意 數值範圍
%y 年(2位) 00, 01, …, 99
%Y 年(4位) 0001, 0002, …, 2013, 2014, …, 9998, 9999
%m 01, 02, …, 12
%d 01, 02, …, 31
%H 時(24小時制) 00, 01, …, 23
%M 00, 01, …, 59
%S 00, 01, …, 59

更多符號含義,參看官方文檔:

strftime url
datetime https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
time https://docs.python.org/3/library/time.html#time.strftime

【注意】:
time、datetime兩種時間模塊雖然都有strftime,但是(格式,時間)參數位置正好相反。
另外datetime的轉義符號更全面,比如%f微秒,只有datetime有,time沒有這個符號

time模塊(格式在前,時間在後)

import time
t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
print(type(t),t)

# 輸出結果
<class 'str'> 2019-05-25 08:56:45

datetime模塊(格式在後,時間在前)

import datetime
dt = datetime.datetime.strftime(datetime.datetime.now(),'%Y-%m-%d %H:%M:%S.%f')
print(type(dt),dt)

# 輸出結果
<class 'str'> 2019-05-25 08:56:45.405471

2、文本轉日期

(1)常規方法strptime("日期時間文本","文本格式")

制定時間格式,進行解析

import datetime
dt = datetime.datetime.strptime('2019-05-25T07:46:45.743+0000','%Y-%m-%dT%H:%M:%S.%f%z')
print(type(dt),dt)

# 輸出結果
<class 'datetime.datetime'> 2019-05-25 07:46:45.743000+00:00

(2)萬能方法parse("日期時間文本")

自動解析

from dateutil.parser import parse
dt = parse('2019-05-25 07:46:45')
print(type(dt),dt)

# 輸出結果
<class 'datetime.datetime'> 2019-05-25 07:46:45

該方法適用於很多類型時間格式,建議使用前自行測試

dt = ["2001.07.04 AD at 12:08:56 PDT",
"Wed, 4 Jul 2001 12:08:56 -0700",
"190525",
"2018-08-06T10:00:00.000Z",
"Wed, Jul 4",
"12:08 PM",
"02001.July.04 AD 12:08 PM",
"20190525083855-0700",
"2001-07-04T12:08:56.235-0700",
"Thu Oct 16 07:13:48 GMT 2014"]

for i in dt:
	print(parse(i))

# 輸出結果
2001-07-04 12:08:56
2001-07-04 12:08:56-07:00
2025-05-19 00:00:00
2018-08-06 10:00:00+00:00
2019-07-04 00:00:00
2019-05-25 12:08:00
2001-07-04 12:08:00
2019-05-25 08:38:55-07:00
2001-07-04 12:08:56.235000-07:00
2014-10-16 07:13:48+00:00

但是注意,國外日期時間的常用格式和國內不一樣。單寫19-05-25會被解析成2025年5月19日

print(parse("19-05-25"))

# 輸出結果
2025-05-19 00:00:00

如果是2019-05-25就不會錯了

print(parse("2019-05-25"))

# 輸出結果
2019-05-25 00:00:00

3、時間戳相關

生成10或13位時間戳(做一些網頁爬蟲或構造提交時候可能用到)

import time
t = time.time()
print(type(t),t)
print('10位時間戳:',str(int(t)))
print('13位時間戳:',str(int(t*1000)))

# 輸出結果
<class 'float'> 1558750679.0872486
10位時間戳: 1558750679
13位時間戳: 1558750679087

時間戳轉日期時間(10位或13位通用)

import datetime
ts = '1517302458364' # 該值爲int或string類型均可
dt1 = datetime.datetime.fromtimestamp(float(ts)/10**(len(str(ts))-10))
print(type(dt1),dt1)

# 輸出結果
<class 'datetime.datetime'> 2018-01-30 16:54:18.364000

4、時間差計算

如果是兩個datatime格式的日期,直接計算一下差值即可

import datetime
dt1 = datetime.datetime.fromtimestamp(1517302458)
dt2 = datetime.datetime.now()
#print(type(dt1),dt1)
#print(type(dt2),dt2)
td = dt2-dt1
#print(type(td),td)
output = '相差%d天%.1f小時'%(td.days,td.seconds/60/60)
print(output)

# 輸出結果
<class 'datetime.datetime'> 2018-01-30 16:54:18
<class 'datetime.datetime'> 2019-12-16 16:18:37.443000
<class 'datetime.timedelta'> 684 days, 23:24:19.443000
相差68423.4小時

如果是兩個文本格式的日期,用parse()轉換成datetime,同樣計算差值即可

import datetime
from dateutil.parser import parse
dt1 = '2018-01-30 16:54:18'
dt2 = '2019-12-16 16:18:37'
td = parse(dt2)-parse(dt1)
print('相差%d天%.1f小時'%(td.days,td.seconds/60/60))

# 輸出結果
相差68423.4小時

5、時區轉換

直接獲取0時區的datetime,並轉化爲東8區datetime

from datetime import datetime,timezone,timedelta
dt0 = datetime.utcnow().replace(tzinfo=timezone.utc)
dt8 = dt0.astimezone(timezone(timedelta(hours=8))) # 轉換時區到東八區
print('UTC協調世界時 \t%s\nUTC+8北京時間\t%s'%(dt0,dt8))

# 輸出結果
UTC協調世界時 	2019-05-25 02:48:54.281741+00:00
UTC+8北京時間	2019-05-25 10:48:54.281741+08:00

如果是想將文本格式的2019-05-25T02:48:54.281741+00:00轉化到東8區datetime

from datetime import datetime,timezone,timedelta
from dateutil.parser import parse
dt0_str = '2019-05-25T02:48:54.281741+00:00'
dt0 = parse(dt0_str)
dt8 = dt0.astimezone(timezone(timedelta(hours=8)))
print(type(dt0),dt0)
print(type(dt8),dt8)

# 輸出結果
<class 'datetime.datetime'> 2019-05-25 02:48:54.281741+00:00
<class 'datetime.datetime'> 2019-05-25 10:48:54.281741+08:00
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章