datetime:タイムゾーンオフセット付きのタイムスタンプを取得します

Nov 23 2020

次の形式で日付からタイムスタンプを取得したいと思います。

Mon, 23 Nov 2020 19:00:00 GMT
Mon, 23 Nov 2020 20:00:00 +0100

次のステートメントを使用して、日付をdatetimeオブジェクトに変換しています。

dateobj = datetime.datetime.strptime(date, '%a, %d %b %Y %H:%M:%S %Z')
dateobj = datetime.datetime.strptime(date, '%a, %d %b %Y %H:%M:%S %z')

しかし、.timestamp()メソッドを使用すると、エポックとは異なる秒が出力されます。%Zディレクティブがタイムゾーン情報をdatetimeオブジェクトに追加しないのはなぜですか?タイムゾーンを考慮に入れてタイムスタンプが等しくなるようにするにはどうすればよいですか?

回答

MrFuppes Nov 24 2020 at 07:21

Pythonの日時解析タイムゾーンに一貫性がないことに注意してください。あなたの問題は、%Zそれが作る、strptime 受け入れ-特定の文字列(GMT、UTCとtime.tznameの任意の値のドキュメントを、実際にそれからは何も行いません)。返されるdatetimeオブジェクトはナイーブです。そのため、Pythonは、そのtimestamp()メソッドを呼び出すと現地時間であると見なします。

代わりに、dateutilのパーサーを使用できます。

from dateutil.parser import parse

for s in ("Mon, 23 Nov 2020 19:00:00 GMT", "Mon, 23 Nov 2020 20:00:00 +0100"):
    dt = parse(s)
    print(repr(dt), dt.timestamp())

# datetime.datetime(2020, 11, 23, 19, 0, tzinfo=tzutc()) 1606158000.0
# datetime.datetime(2020, 11, 23, 20, 0, tzinfo=tzoffset(None, 3600)) 1606158000.0