Python 3日付テキスト相互転送、タイムスタンプ、時間差、タイムゾーン変換

31798 ワード

2019-05-25整理して簡略化し、いくつかの常用日付時間処理方法をまとめた.2019-12-16いくつかの表現を最適化し、より理解しやすく、実際の過程で直接使用するのに便利である.
以下は基本的に私が日常的にコードを書く中で、最もよく使う日付関連部分です.
1.現在時刻のテキスト転送strftime()timeまたはdatetimeにかかわらず、どのモジュールも可能であり、具体的にどのように出力するかは、フォーマットパラメータ'%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-252025 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ビットのタイムスタンプを生成します(一部のWebページの爬虫類や構造のコミットに使用する場合があります).
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,float,string  
dt1 = datetime.datetime.fromtimestamp(int((str(ts).strip().replace(".",""))[:10]))
print(type(dt1),dt1)

#     
<class 'datetime.datetime'> 2018-01-30 16:54:18.364000

タイムスタンプタイムテキスト(10ビットまたは13ビット共通)
import time
ts = '1517302458364' #      int,float,string  
dt1 = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int((str(ts).strip().replace(".",""))[:10])))
print(type(dt1),dt1)

#     
<class 'str'> 2018-01-30 16:54:18

4、時間差計算
2つの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
  684 23.4  

2つのテキスト形式の日付であれば、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))

#     
  684 23.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
UTC+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