datetime: pobierz znacznik czasu z przesunięciem strefy czasowej

Nov 23 2020

Chciałbym uzyskać sygnaturę czasową z dat w następujących formatach:

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

Do konwersji dat na datetimeobiekty używam następujących instrukcji :

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

Ale używając .timestamp()metody, drukowane są różne sekundy z epoki. Dlaczego %Zdyrektywa nie dodaje informacji o strefie czasowej do datetimeobiektu? Jak mogę uwzględnić strefę czasową, aby sygnatura czasowa była równa?

Odpowiedzi

MrFuppes Nov 24 2020 at 07:21

Uwaga: Niespójna strefa czasowa analizy daty i godziny w Pythonie . Twój problem polega na tym %Z, że strptime akceptuje określone ciągi (GMT, UTC i dowolną wartość w time.tzname - docs ), ale tak naprawdę nic z tego nie robi. Zwracany obiekt datetime jest naiwny - dlatego Python zakłada, że ​​jest to czas lokalny, jeśli wywołasz jego timestamp()metodę.

Zamiast tego możesz użyć parsera 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