Was ist der einfachste Weg, um die aktuelle GMT-Zeit im Unix-Zeitstempelformat abzurufen?

175

Python bietet verschiedene Pakete (datetime , time, calendar) als zu sehen sind hier , um mit der Zeit zu beschäftigen. Ich habe einen großen Fehler gemacht, indem ich Folgendes verwendet habe, um die aktuelle GMT-Zeit zu erhaltentime.mktime(datetime.datetime.utcnow().timetuple())

Was ist eine einfache Möglichkeit, die aktuelle GMT-Zeit im Unix-Zeitstempel abzurufen?

Cory
quelle
1
Was sind Eingabe / Ausgabe? datetime.utcnow()Gibt die aktuelle UTC-Zeit als Datum / Uhrzeit-Objekt zurück (ich nehme an, Sie möchten UTC, wenn Sie von "GMT-Zeit" sprechen). time.time()Gibt den Unix-Zeitstempel direkt als Gleitkommazahl zurück. So konvertieren Sie datetime.date/datetime.datetime, die die Zeit in UTC darstellt, in den POSIX-Zeitstempel .
JFS
Ist Ihre vorgeschlagene Methode falsch oder einfach zu ausführlich? Siehe auch
Ciro Santilli 5 冠状 病 六四 事件 法轮功
Warum war Ihre Methode ein Fehler?
Skeller88

Antworten:

230

Ich würde time.time () verwenden, um einen Zeitstempel in Sekunden seit der Epoche zu erhalten.

import time

time.time()

Ausgabe:

1369550494.884832

Für die Standard-CPython-Implementierung auf den meisten Plattformen wird ein UTC-Wert zurückgegeben.

Edmond Burnett
quelle
21
Der Haken ist, dass die lokale Uhr Ihres Computers möglicherweise nicht in UTC ist.
9000
@ 9000: Richtig, obwohl ich in jeder Umgebung, in der Zeitmessung wichtig ist, immer auf UTC bestehen würde. Und er hat nach der einfachsten Lösung gefragt. Beachten Sie, dass mit CPython auf modernen Plattformen, einschließlich Linux, BSD, Mac OS X und Windows, UTC für time.time () zurückgegeben wird. Dies spiegelt das Verhalten der Zeitfunktion der C-Standardbibliothek auf diesen Betriebssystemen wider.
Edmond Burnett
66
@ 9000: Lokale Zeitzone spielt keine Rolle. Die Unix-Zeit entspricht der UTC-Zeit (wenn wir die Zeit um Schaltsekunden ignorieren). Denken Sie darüber nach: Der Zeitstempel ist die Anzahl der Sekunden, die seit der Epoche vergangen sind (ein fester Zeitpunkt): Warum sollte es davon abhängen, welche lokale Uhr der Zeitzonenmaschine verwendet? Zu jedem Zeitpunkt ist die Unix-Zeit auf der ganzen Welt dieselbe. Einige (unbekannte) Plattformen verwenden möglicherweise eine andere Epoche, aber ihr Wert hängt immer noch nicht von der lokalen Zeitzone ab.
JFS
stackoverflow.com/questions/13890935/…
Ciro Santilli 5 冠状 病. 六四 法轮功
125
import time

int(time.time()) 

Ausgabe:

1521462189
Max
quelle
42

Hilft das?

from datetime import datetime
import calendar

d = datetime.utcnow()
unixtime = calendar.timegm(d.utctimetuple())
print unixtime

So konvertieren Sie das Python UTC-Datum / Uhrzeit-Objekt in einen UNIX-Zeitstempel

Nick Caplinger
quelle
@ Cairnarvon Das war nur ein Beispiel. Wenn Sie den aktuellen Zeitstempel möchten, können Sie einfach anrufen time.time()und benötigen überhaupt keine Datums- / Uhrzeitkonvertierung.
Messa
1
FWIW: Dies ist nicht die UTC-Zeit, sondern die in Ortszeit konvertierte UTC. Um einen Zeitstempel in UTC zu erhalten, müssen Sie etwas anderes tun.
Sherlock70
18

Oder verwenden Sie einfach das datetime-Standardmodul

In [2]: from datetime import timezone, datetime
   ...: int(datetime.now(tz=timezone.utc).timestamp() * 1000)
   ...: 
Out[2]: 1514901741720

Sie können je nach gewünschter Auflösung abschneiden oder multiplizieren. In diesem Beispiel wird Millis ausgegeben.

Wenn Sie einen korrekten Unix- Zeitstempel (in Sekunden) wünschen, entfernen Sie den* 1000

Maresh
quelle
Ihr Code erzwingt ganz speziell, dass die Zeit in eine Ganzzahl umgewandelt wird. Ich bin also verwirrt, warum der Ausgabetext eine Dezimalzahl ist.
Weston
ye my bad, ich fügte das int Casting später hinzu
Maresh
Dies ist das genaue Äquivalent der Javascript- momentBibliothek moment().utc().valueOf(). Genau das, wonach ich gesucht habe. Vielen Dank
Azhar22k
Der UNIX-Zeitstempel soll seit 1970 Sekunden betragen. Ihre Lösung erzeugt dies nicht.
Skyking
1
"Sie können je nach gewünschter Auflösung abschneiden oder multiplizieren." Wenn Sie den * 1000-Teil fallen lassen, erhalten Sie Sekunden.
Maresh
18

Python2 und Python3

Es ist gut, das Zeitmodul zu verwenden

import time
int(time.time())

1573708436

Sie können auch das Datum / Uhrzeit-Modul verwenden, aber wenn Sie strftime ('% s') verwenden, konvertieren strftime die Zeit in Ihre Ortszeit!

python2

from datetime import datetime
datetime.utcnow().strftime('%s')

python3

from datetime import datetime
datetime.utcnow().timestamp()
MikA
quelle
2
Da in UTC + 1, time.time()und datetime.utcnow().timestamp()sie nicht gibt den gleichen Wert!
user136036
Auch wenn ich erwartet hatte, dass die 2. Option korrekt ist, musste ich datetime.now (). Timestamp () verwenden, um den korrekten Wert in UTC + 1100 zu erhalten. Ich habe erwartet, dass timestamp () für beide korrekt funktioniert, aber es scheint nicht so
David Waterworth
Bei näherer Betrachtung geben sowohl datetime.utcnow () als auch datetime.now () eine naive datetime (kein tzinfo) zurück, und timestamp () scheint lokal anzunehmen, wenn tzinfo = null ist.
David Waterworth
2

Ich mag diese Methode:

import datetime, time

dts = datetime.datetime.utcnow()
epochtime = round(time.mktime(dts.timetuple()) + dts.microsecond/1e6)

Bei den anderen hier veröffentlichten Methoden wird entweder nicht garantiert, dass Sie auf allen Plattformen UTC erhalten, oder es werden nur ganze Sekunden gemeldet. Wenn Sie die volle Auflösung wünschen, funktioniert dies auf die Mikrosekunde genau.

vschmidt
quelle
1
Leider scheint dies keine UTC zu geben, es sei denn, Sie befinden sich zufällig in einer UTC + 0000-Zeitzone. Verwenden Sie utctimetuplestattdessen den Trick.
Skyking
1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

Ausgabe:

1544524990
2ni
quelle
das gibt nicht das gleiche zurück wie time.time()für mich.
Alwinius
1
Das liegt wahrscheinlich daran, dt.utcnowdass Sie eine datetimeInformation ohne Zeitzone zurückgeben. Dann wird strftimedavon ausgegangen, dass dies die datetimeOrtszeit ist.
Skyking
1
@skyking Das ist so ziemlich das Problem für fast alle Antworten auf dieser Seite!
David Waterworth
1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

Ausgabe: 1572878043380

#second example:
import time
timstamp2 =int(time.time())
print(timstamp2)

Ausgabe: 1572878043

  • Hier sehen wir, dass das erste Beispiel eine genauere Zeit liefert als das zweite.
  • Hier benutze ich den ersten.
Chandan Sharma
quelle
1

Zumindest in Python3 funktioniert dies:

>>> datetime.strftime(datetime.utcnow(), "%s")
'1587503279'
Benutzername
quelle