Python – Festlegen einer Datums- und Uhrzeitangabe in einer bestimmten Zeitzone (ohne UTC-Konvertierungen)

StackOverflow https://stackoverflow.com/questions/4974712

  •  12-11-2019
  •  | 
  •  

Frage

Um es klarzustellen: Das ist Python 2.6, ich verwende Pytz.

Dies gilt für eine Anwendung, die sich nur mit US-Zeitzonen befasst. Ich muss in der Lage sein, ein Datum (heute) zu verankern und einen Unix-Zeitstempel (Epochenzeit) nur für 20:00 Uhr und 23:00 Uhr in PST zu erhalten.

Das macht mich verrückt.

> pacific = pytz.timezone("US/Pacific")

> datetime(2011,2,11,20,0,0,0,pacific)

datetime.datetime(2011, 2, 11, 20, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:0 STD>)

> datetime(2011,2,11,20,0,0,0,pacific).strftime("%s")
'1297454400'

zsh> date -d '@1297454400'    
Fri Feb 11 12:00:00 PST 2011

Obwohl ich also eine Zeitzone einrichte und die Datums- und Uhrzeitangabe erstelle mit Diese Zeitzone wird immer noch als UTC erstellt und dann konvertiert.Dies ist ein größeres Problem, da UTC einen Tag voraus sein wird, wenn ich versuche, die Berechnungen durchzuführen.

Gibt es eine einfache (oder zumindest sinnvolle) Möglichkeit, heute einen Zeitstempel für 20:00 Uhr PST zu generieren?

(Um es klarzustellen: Ich verstehe den Wert der Verwendung von UTC in den meisten Situationen, z. B. für Datenbank-Zeitstempel oder für die allgemeine Speicherung.Dies ist keine dieser Situationen. Ich benötige insbesondere einen Zeitstempel für den Abend in PST, und UTC sollte dort nicht eingegeben werden müssen.)

War es hilfreich?

Lösung

Erstellen Sie ein tzinfo-Objekt utc für die UTC-Zeitzone, dann versuchen Sie Folgendes:

#XXX: WRONG (for any timezone with a non-fixed utc offset), DON'T DO IT
datetime(2011,2,11,20,0,0,0,pacific).astimezone(utc).strftime("%s")

Bearbeiten: Wie in den Kommentaren erwähnt, wird die Zeitzone in die eingegeben datetime Der Konstruktor ist nicht immer robust.Die bevorzugte Methode mit der Pytz-Dokumentation wäre:

pacific.localize(datetime(2011,2,11,20,0,0,0)).astimezone(utc).strftime("%s")

Beachten Sie auch aus den Kommentaren, dass strftime("%s") ist nicht zuverlässig, es ignoriert die Zeitzoneninformationen (sogar UTC) und übernimmt die Zeitzone des Systems, auf dem es läuft.Es basiert auf einer zugrunde liegenden C-Bibliotheksimplementierung und funktioniert auf einigen Systemen überhaupt nicht (z. B.Windows).

Andere Tipps

Es gibt mindestens zwei Probleme:

    .
  1. Sie sollten keine Zeitzone mit nicht festgelegter UTC-Offset wie "US/Pacific" als Tzinfo-Parameter direkt bestehen.Sie sollten pytz.timezone("US/Pacific").localize()-Methode stattdessen verwenden
  2. .strftime('%s') ist nicht tragbar, Es ignoriert tzinfo , und es verwendet immer die örtliche Timezone.Verwenden Sie den datetime.timestamp() oder seine Analoga an älteren Python-Versionen .

    Um eine timezone-wesentliche DateTime in der angegebenen Zeitzone zu erstellen: generasacodicetagpre.

    , um POSIX-Zeitstempel zu erhalten: generasacodicetagpre.

    (auf Python 2.6, siehe totimestamp()-Funktion, wie man die generationspoDicetagcode-Methode emulieren).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top