Wie erhalte ich die Sekunden seit der Epoche aus der Zeit + Datum-Ausgabe von gmtime ()?

162

Wie kehren Sie um gmtime(), wo Sie die Uhrzeit + das Datum eingeben und die Anzahl der Sekunden erhalten?

Ich habe Zeichenfolgen wie 'Jul 9, 2009 @ 20:02:58 UTC'und ich möchte die Anzahl der Sekunden zwischen der Epoche und dem 9. Juli 2009 zurückbekommen.

Ich habe es versucht, time.strftimeaber ich weiß nicht, wie ich es richtig verwenden soll oder ob es der richtige Befehl ist.

calccrypto
quelle

Antworten:

123

Wenn Sie hierher gekommen sind, weil Ihnen eine Suchmaschine mitgeteilt hat, wie Sie den Unix-Zeitstempel erhalten, hören Sie auf, diese Antwort zu lesen. Scrollen Sie einen nach unten.

Wenn Sie umkehren time.gmtime()möchten, möchten Sie calendar.timegm().

>>> calendar.timegm(time.gmtime())
1293581619.0

Sie können Ihre Zeichenfolge in ein Zeittupel mit verwandeln time.strptime(), das ein Zeittupel zurückgibt, an das Sie übergeben können calendar.timegm():

>>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778

Weitere Informationen zum Kalendermodul finden Sie hier

nmichaels
quelle
16
Wenn Sie nach der aktuellen Unix-Epoche suchen, lesen Sie bitte den Kommentar von @ DanJ oder die Antwort von naren. Diese Antwort ist falsch!
Kosii
634

Verwenden Sie das Zeitmodul:

epoch_time = int(time.time())
naren
quelle
14
@DanJ: Es ist die Anzahl der seit Epoche verstrichenen Sekunden (ein fester Zeitpunkt) und in jeder Zeitzone gleich. Wenn wir jedoch Zeitinstanzen um Schaltsekunden ignorieren; Es ist einfach, es in UTC zu konvertieren, wenn timeUnix Epoch (1970) verwendet wird.
JFS
41
Beachten Sie, dass dies nicht das ist, wonach das OP gefragt hat, aber es ist das, was ich wollte. Also +1.
fearless_fool
6
es ist die Antwort auf das, was im Titel gefragt wird: "Die Zeit seit der Epoche bekommen". +1
AlejandroVD
@JFSebastian dies gibt Epoche zu Sekunden. Wie kann ich die Auflösung mit derselben Antwort wie oben auf Millisekunden bringen?
Marlon Abeykoon
2
Um meinen obigen Kommentar zu erweitern : Der time.time()Wert hängt NICHT von der lokalen Zeitzone ab (wenn wir "richtige" Zeitzonen und dergleichen ausschließen), z. B. wenn er die POSIX-Zeit zurückgibt (wie es auf den meisten Systemen der Fall ist), dann ist es die Anzahl der SI-Sekunden seitdem Die Epoche (1970-01-01UTC) zählt keine Schaltsekunden. Dieser Wert kann in UTC konvertiert werden (ohne Schaltsekunden), ist jedoch nicht UTC . @ MarlonAbeykoon: Ich mag diese Antwort
jfs
9

Beachten Sie, dass time.gmtimeKarten Zeitstempel 0auf 1970-1-1 00:00:00.

In [61]: import time       
In [63]: time.gmtime(0)
Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time.mktime(time.gmtime(0)) gibt Ihnen einen Zeitstempel, der um einen Betrag verschoben ist, der von Ihrem Gebietsschema abhängt und im Allgemeinen nicht 0 sein kann.

In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0

Die Umkehrung von time.gmtimeist calendar.timegm:

In [62]: import calendar    
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0
unutbu
quelle
Dies gibt eine bessere Erklärung und ein besseres Beispiel für time.mktime (die die aktuelle Zeitzone berücksichtigen), danke
Jkm
@Jkm: NICHT verwenden mktime()mit gmtime(). mktime()akzeptiert Ihre Ortszeit , gmtime()gibt aber die UTC-Zeit zurück - Ihre Ortszeitzone kann und wird wahrscheinlich anders sein. "Zeitstempel relativ zu Ihrem Gebietsschema" ist unsinnig: Der POSIX-Zeitstempel hängt nicht von Ihrem Gebietsschema (lokale Zeitzone) ab - er ist weltweit der gleiche Wert. "Sekunden seit Epoche" ist in den meisten Fällen (auch unter Windows) der POSIX-Zeitstempel - Dinge wie "richtige" Zeitzonen, die die TAI-Zeitskala verwenden, sind nicht üblich. Siehe Gibt Pythons time.time () den lokalen oder UTC-Zeitstempel zurück?
JFS
@JF Sebastian Du hast recht. Eigentlich habe ich vor mktime()kurzem ein paar Probleme bekommen . Bei einigen Python-Webservern (z. B. Tornado) verwendet die mktime()von der Webserver-API aufgerufene Zeitzone weiterhin die alte Zeitzone , um das Zeitobjekt zu generieren , da der Prozess weiterhin ausgeführt wird, auch wenn ich das Systemgebietsschema ändere . Ich muss zum gmtime()GMT-Offset wechseln und ihn manuell anwenden.
Jkm
5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

Dies sollte sich von unterscheiden int(time.time()), aber es ist sicher, so etwas zu verwendenx % (60*60*24)

Datum / Uhrzeit - Grundlegende Datums- und Uhrzeittypen:

Im Gegensatz zum Zeitmodul unterstützt das Datum / Uhrzeit-Modul keine Schaltsekunden.

user3226167
quelle
3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")
Falmarri
quelle
Ich kann aus irgendeinem Grund nicht auf strptime zugreifen. Ich habe datetime
calccrypto
1
@calccrypto müssen Sie entweder from datetime import datetimeoder tundatetime.datetime.strptime
pathikrit