Wie bekomme ich UTC-Zeit in Python?

111

Ich habe eine Menge auf StackExchange nach einer Lösung durchsucht, aber nichts macht genau das, was ich brauche. In JavaScript verwende ich Folgendes, um die UTC-Zeit seit dem 1. Januar 1970 zu berechnen:

function UtcNow() {
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;
}

Was wäre der entsprechende Python-Code?

James Clarke
quelle
Warten Sie, verwenden Sie Python oder JavaScript?
CheetSheatOverlode

Antworten:

177

Versuchen Sie diesen Code, der datetime.utcnow () verwendet :

from datetime import datetime
datetime.utcnow()

Wenn Sie für Ihre Zwecke einen Zeitaufwand zwischen zwei Daten berechnen müssen, müssen Sie lediglich die End- und Startdaten abziehen. Das Ergebnis einer solchen Subtraktion ist ein Zeitdelta-Objekt.

Aus den Python-Dokumenten:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

Dies bedeutet, dass Sie standardmäßig alle in der Definition genannten Felder abrufen können - Tage, Sekunden, Mikrosekunden, Millisekunden, Minuten, Stunden, Wochen. Außerdem hat die timedelta-Instanz die Methode total_seconds (), die:

Gibt die Gesamtzahl der Sekunden zurück, die in der Dauer enthalten sind. Entspricht (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6, berechnet mit aktivierter wahrer Division.

Artsiom Rudzenka
quelle
1
Eine möglicherweise böse Überraschung bei datetime.utcnow () ist, dass trotz des Namens kein zeitzonenbewusstes Objekt zurückgegeben wird. Dies ist meiner Meinung nach ein großes Problem, weshalb ich meine Antwort unten bevorzuge. Siehe "Datetime-Objekte ohne Zeitzone sollten als" Fehler "in der Anwendung betrachtet werden." julien.danjou.info/python-and-timezones
Tim Richardson
Das Konzept eines sogenannten naiven Datetime-Objekts (dh es werden keine Zeitzoneninformationen festgelegt) erfüllt einen Zweck: Ich möchte, dass mein Wecker jeden Tag um 06:00:00 Uhr klingelt, egal wo auf der Welt ich mich befinde. Außerdem erlaubt es "virtuelle Uhren" in Computerspielen: Es ist jetzt 17 Uhr in meiner Fantasiewelt. Das Erzwingen einer Zeitzone auf das Datum / Uhrzeit-Objekt wäre insbesondere bei Zeitdelta-Arithmetik umständlich.
DustByte
41

In der Form, die Ihrem Original am nächsten kommt:

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now

Wenn Sie die Anzahl der Sekunden vom 01.01.1970 anstelle eines nativen Pythons kennen müssen datetime, verwenden Sie stattdessen Folgendes :

return (now - datetime.datetime(1970, 1, 1)).total_seconds()

Python hat Namenskonventionen, die im Widerspruch zu dem stehen, was Sie in Javascript gewohnt sind (siehe PEP 8) . Außerdem ist eine Funktion, die einfach das Ergebnis einer anderen Funktion zurückgibt, ziemlich dumm. Wenn es nur darum geht, den Zugriff zu erleichtern, können Sie einen anderen Namen für eine Funktion erstellen, indem Sie sie einfach zuweisen. Das erste Beispiel oben könnte ersetzt werden durch:

utc_now = datetime.datetime.utcnow
Mark Ransom
quelle
1
Ich mag Ihre Antwort besser als die höher bewertete von oben. Vielen Dank für die Tiefe hier.
Jordan Dea-Mattson
@Jordan, wenn ich auf meine Antwort zurückblicke, stelle ich fest, dass ich einen Stilfehler gemacht habe, indem ich den Import in die Funktion und nicht auf globaler Ebene eingefügt habe. Ich werde das jetzt beheben.
Mark Ransom
8
Vielleicht sollten Sie UtcNow () in eine andere Funktion einbinden. Es ist einfach zu einfach. Verwenden Sie auch weiterhin keine Unterstriche. PEP 8 ist so langweilig ...
Vcarel
1
Sie müssen definitiv keine Funktion schreiben, um einen einfachen Einzeiler zurückzugeben ... datetime.datetime.utcnow ()
cpreid
1
@ TimRichardson Ich bin nicht anderer Meinung, aber zum Zeitpunkt der Erstellung dieser Antwort gab es keine Alternative - Python enthielt keine tzinfoObjekte, auch nicht für UTC.
Mark Ransom
29

Einfache Standardbibliothek nur für modernes Python. Gibt im Gegensatz zu zeitzonenabhängiger Datums- und Uhrzeitangabe datetime.utcnow(). datetimesOhne Zeitzonen warten Unfälle darauf, passiert zu werden.

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)
Tim Richardson
quelle
4
Laut der Python 3-Dokumentation ist dies die empfohlene Vorgehensweise.
Roskakori
Sauber und einfach! Sollte der bevorzugte Weg sein.
Marry35
21
import datetime
import pytz

# datetime object with timezone awareness:
datetime.datetime.now(tz=pytz.utc)

# seconds from epoch:
datetime.datetime.now(tz=pytz.utc).timestamp() 

# ms from epoch:
int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 
MikeL
quelle
10

Ab datetime.datetime können Sie bereits mit der Methode strftime in Zeitstempel exportieren. Folgen Sie Ihrem Funktionsbeispiel:

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))

Wenn Sie Mikrosekunden möchten, müssen Sie die Exportzeichenfolge ändern und so umwandeln, dass sie wie folgt schwebt: return float(now.strftime("%s.%f"))

Hectorcanto
quelle
Was bringt es, in eine Zeichenfolge und dann zurück in eine Zahl zu konvertieren, wenn Sie die Zahl direkt erhalten können?
Mark Ransom
Der Punkt ist, dass Sie möglicherweise Änderungen an der Funktion vornehmen möchten und sich aus diesem Grund besser an das Datum / Uhrzeit-Objekt halten und es nicht verwenden time.time(). Sie können auch time.mktime (now.timetuple ()) verwenden, um direkt in int zu konvertieren. Auf jeden Fall time.time()ist für diesen einfachen Fall auch eine gültige Option. Was ich merkwürdig finde, ist, per Zeitdelta die Sekunden zu finden.
Hectorcanto
Beachten Sie, dass dies strftime("%s")plattformabhängig ist und unter Windows nicht funktioniert. (Zumindest nicht für mich unter Windows 10).
Julian Kirsch
7

Zeitzonenbewusst ohne externe Abhängigkeiten:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)
Cesar Canassa
quelle
-4

Probieren Sie es in Python 3 mit dem Lambda-Ausdruck aus.

from datetime import datetime
utc_now = lambda : datetime.utcnow()

und rufen Sie die Funktion normal auf;

print(utc_now())
STRASSENGELD
quelle
2
sei jetzt nett Kinder; ^)
Demis