Gibt Pythons time.time () den lokalen oder UTC-Zeitstempel zurück?

559

Gibt time.time()das Python-Zeitmodul die Systemzeit oder die Zeit in UTC zurück?

Saransh Mohapatra
quelle
87
Zeitstempel haben keine Zeitzonen. Sie repräsentieren eine Anzahl von Sekunden seit der Epoche. Die Epoche ist ein bestimmter Zeitpunkt, der nicht von der Zeitzone abhängt.
JWG
2
@jwg: Die häufig verwendeten POSIX-Zeitstempel zählen keine Schaltsekunden und sind daher nicht die "Anzahl der [verstrichenen SI] Sekunden seit der Epoche" (sie sind nahe beieinander).
JFS
7
Ich denke nicht, dass dies ein genauer Einwand @JFSebastian ist. Schaltsekunden sind keine "seit der Epoche verstrichenen Sekunden". Dies sind Änderungen der Zeitdarstellungen, die von Uhren aufgezeichnet werden und nicht den verstrichenen Sekunden entsprechen.
JWG
4
@JFSebastian Entschuldigung für die Verwirrung. Schaltsekunden sind keine "verstrichenen Sekunden". Daher enthalten Zeitstempel, bei denen es sich um die Anzahl der verstrichenen Sekunden handelt, keine Schaltsekunden und sollten diese auch nicht enthalten.
JWG
2
@jwg falsch. Sie können die physische Zeit nicht löschen. Der POSIX-Zeitstempel ist nicht die Anzahl der verstrichenen SI-Sekunden. Hier ein Beispiel: Zwischen "31. Dezember 2016 um 18:59:59 Uhr" und "31. Dezember 2016 um 19:00:01 Uhr" in New York sind 3 Sekunden vergangen, aber der Unterschied in den entsprechenden POSIX-Zeitstempeln beträgt nur 2 Sekunden (die Schaltsekunde wird nicht gezählt).
JFS

Antworten:

780

Die time.time()Funktion gibt die Anzahl der Sekunden seit der Epoche als Sekunden zurück. Beachten Sie, dass die "Epoche" als Beginn des 1. Januar 1970 in UTC definiert ist. Die Epoche wird also in Bezug auf UTC definiert und legt einen globalen Zeitpunkt fest. Egal, wo Sie sich "Sekunden nach der Epoche" befinden (time.time ()), gibt im selben Moment denselben Wert zurück.

Hier ist eine Beispielausgabe, die ich auf meinem Computer ausgeführt und ebenfalls in eine Zeichenfolge konvertiert habe.

Python 2.7.3 (default, Apr 24 2012, 00:00:54) 
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>

Die tsVariable ist die in Sekunden zurückgegebene Zeit. Ich habe es dann mithilfe der datetimeBibliothek in eine Zeichenfolge konvertiert, sodass es für Menschen lesbar ist.

squiguy
quelle
72
Warum sollten wir, import timewenn datetime Ihnen im Grunde einen Zeitstempel gibt? Entfernen Sie einfach die Millisekunden -str(datetime.datetime.now()).split('.')[0]
Hussain
17
@Alexis Unix-Epoche ist hier ziemlich klar definiert . Es zeigt sogar ein Python-Beispiel auf der ganzen Seite. Ich verstehe deinen Kommentar nicht.
Squiguy
9
@squiguy um ehrlich zu sein Ich erinnere mich nicht, warum ich das gesagt habe. Ich muss etwas falsch verstanden haben, und ich hatte Mühe herauszufinden, warum einige Tests unterbrochen wurden, während ich zwischen Frankreich und den USA umzog, um schließlich festzustellen, dass das Problem auf die Sommerzeit zurückzuführen ist, die die Woche in dieser Jahreszeit verlängert. Tut mir leid und ich danke Ihnen, dass Sie darauf hingewiesen haben.
Alexis
5
Es ist nicht "Sekunden in UTC". . Der von zurückgegebene Zeitstempel time.time()befindet sich in keiner Zeitzone . "Sekunden seit der Epoche" ist ein Begriff; Es sind keine Sekunden seit einem bestimmten Zeitpunkt (Epoche) vergangen . Sie können es einfach in Ihre Ortszeit (mit tz-Datenbank) und / oder UTC-Zeitzone konvertieren . Übrigens, wenn Sie fallen lassen, ist .strftime()das Ergebnis (fast) das gleiche (+/- Mikrosekunden).
JFS
3
habe es gerade getestet, time.time () gibt keine UTC-Zeit an, es gibt meine lokale Zonenzeit an
sliders_alpha
301

Dies ist für die Textform eines Zeitstempels , der in Ihren Textdateien verwendet werden kann. (Der Titel der Frage war in der Vergangenheit anders, daher wurde die Einführung zu dieser Antwort geändert, um zu verdeutlichen, wie sie als Zeit interpretiert werden kann. [Aktualisiert am 14.01.2016])

Sie können den Zeitstempel als Zeichenfolge mit dem .now()oder .utcnow()von datetime.datetime:

>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000

Die nowunterscheiden sich von utcnowden erwarteten - ansonsten funktionieren sie genauso:

>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000

Sie können den Zeitstempel für die Zeichenfolge explizit rendern:

>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'

Oder Sie können den Zeitstempel noch expliziter formatieren, wie Sie möchten:

>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'

Wenn Sie das ISO-Format möchten, verwenden Sie die .isoformat()Methode des Objekts:

>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'

Sie können diese in Variablen für Berechnungen und Drucken ohne Konvertierungen verwenden.

>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980
pepr
quelle
1
Ich wollte die Epochenzeit ... nicht im Datumsformat ... wie aus meiner Erwähnung der Befehlszeit hervorgeht.time ()
Saransh Mohapatra
34
OK, kein Problem. Jemand anderes benötigt möglicherweise einen Zeitstempel , um ihn in Textdateien zu platzieren.
Pepr
1
Ich bin ein anderer, der wahrscheinlich aufgrund der unangemessenen Anzahl von Upvotes hierher umgeleitet wurde . Die Frage ist fehlerhaft und die akzeptierte Antwort irreführend für den typischen Bedarf: ein vom Menschen lesbares Suffix - beispielsweise für Dateinamen - in der am häufigsten verwendeten Server-Zeitzone zu erhalten.
Verwenden Sie import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Folgendes, um einen Zeitstempel als Teil einer Zeichenfolge zu drucken: Python2: Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE
datetime.datetime.utcnow()ist böse Es wird eine naive Datumszeit erstellt, die keine Ortszeit ist. Sofern Ihre Ortszeit nicht UTC ist, ist sie FALSCH. Verwenden Sie datetime.datetime.now(datetime.timezone.utc)stattdessen. Dadurch wird eine zeitzonenbezogene Datums- und Uhrzeitangabe erstellt, die die aktuelle Uhrzeit darstellt.
Terrel Shumway
139

Basierend auf der Antwort von #squiguy würde ich cast from float eingeben, um einen echten Zeitstempel zu erhalten.

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318

Zumindest ist das das Konzept.

Rudi Strydom
quelle
1
Was ist der Grund für die Typisierung des Zeitstempels? Was ist der Typ standardmäßig?
Tizzee
3
@ Tizzee type(time.time())gibt<type 'float'>
berühmte Garkin
4
Wenn Sie jedoch eine genauere Zeit als in Sekunden benötigen, ist der Schwimmer sinnvoll.
Pepr
3
@RudiStrydom: Python ist stark typisiert. Verwechseln Sie es nicht mit statischer Eingabe.
JFS
1
@CheokYanCheng: int()ist polymorph. Bei longalten Python-Versionen wird es bei Bedarf zurückgegeben - bei neuen Python-Versionen sind alle Ganzzahlen lang.
JFS
30

Die Antwort könnte keine oder beide sein.

  • Weder noch: time.time()Gibt ungefähr die Anzahl der Sekunden zurück, die seit der Epoche vergangen sind. Das Ergebnis hängt nicht von der Zeitzone ab, daher ist es weder UTC noch Ortszeit. Hier ist die POSIX-Definition für "Sekunden seit der Epoche" .

  • beides: time.time()Die Uhr Ihres Systems muss nicht synchronisiert werden, damit sie ihren Wert widerspiegelt (obwohl dies nichts mit der lokalen Zeitzone zu tun hat). Unterschiedliche Computer können gleichzeitig unterschiedliche Ergebnisse erzielen. Auf der anderen Seite , wenn Ihr Computer Zeit wird synchronisiert dann ist es einfach , die UTC - Zeit aus dem Zeitstempel zu erhalten (wenn wir Schaltsekunden ignorieren):

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)

Informationen zum Abrufen von Zeitstempeln aus der UTC-Zeit in verschiedenen Python-Versionen finden Sie unter Wie kann ich ein Datum nach UTC in Sekunden seit der Epoche konvertieren lassen?

jfs
quelle
4
Dies ist die einzige Antwort, die richtig erwähnt wird, datetime.utcfromtimestampwährend es 308 positive Stimmen für eine Antwort mit datetime.fromtimestamp:-(
@TerrelShumway Die Frage ist, was die time.time()Funktion zurückgibt (es ist sehr kurz). Ihr Kommentar befasst sich mit einer anderen Frage (Sie haben Ihren Kommentar geändert, seit ich ihn beantworte. Zum Schlechten). Eine Randnotiz; Das Wort "richtig" sollte sparsam verwendet werden (Zeitzonen sind kompliziert - es gibt keine Silberkugel - nur Kompromisse für einen bestimmten Anwendungsfall).
JFS
Nicht verwenden datetime.datetime.utcfromtimestamp(ts). Sofern Ihre Ortszeit nicht UTC ist, ist sie FALSCH, da dadurch eine naive Datumszeit erstellt wird, die keine Ortszeit ist. Verwenden Sie datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)stattdessen. Dadurch wird eine zeitzonenbezogene Datums- und Uhrzeitangabe erstellt, die denselben Zeitpunkt wie der Zeitstempel darstellt.
Terrel Shumway
Ja. Mein vorheriger Kommentar war absolut falsch. Der größte Teil des Codes im datetime-Modul behandelt naive datetimes als Ortszeit. Das Verwenden von naiven Datumsangaben ist wie das Öffnen einer Textdatei ohne Kenntnis der Codierung.
Terrel Shumway
@TerrelShumway Es ist falsch anzunehmen, dass die UTC-Zeit nur auf Systemen verwendet werden darf, auf denen es sich um die Ortszeit handelt. Es ist wahr, dass einige Teile von stdlib naive datetime-Objekte so behandeln, dass sie (leider) die lokale Zeitzone haben. Ich würde es vorziehen, naive_dt.astimezone()wenn bytes.encode()es in Python 3 nicht mehr implizit existiert. Es ist wahr, dass es in vielen Fällen vorteilhaft ist, intern mit der UTC-Zeit zu arbeiten. Es gibt sehr viele Dinge, die über das datetime-Modul gesagt werden können (ich habe genug Fragen beantwortet, um ein goldenes Abzeichen zu erhalten). Die meisten sind für die Frage, was time.time()zurückkommt, nicht möglich.
JFS
4

Ich entschied mich schließlich für:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
Natim
quelle
1
Das mag Ihre lokalen Bedürfnisse befriedigen, aber es kann für Leute irreführend sein, die erwarten, dass Zahlen in diesem Bereich Sekunden seit der [GMT] -Epoche betragen. time.time()Gibt Dezimal / Float-ähnlich zurück 1574115250.818733und Millisekunden seit Epoche ist leicht int(time.time() * 1000)zB1574115254915
MarkHu
3

In einer bestimmten Zeitzone gibt es keine "Epoche". Die Epoche ist als ein bestimmter Zeitpunkt genau definiert. Wenn Sie also die Zeitzone ändern, ändert sich auch die Zeit selbst. Insbesondere ist diesmal Jan 1 1970 00:00:00 UTC. So time.time()gibt die Anzahl der Sekunden seit der Epoche.

HyperNeutrino
quelle
Während es stimmt, dass UTC ein Zeitstandard und keine Zeitzone ist, ist der Standard, dass es dieselbe Zeit wie GMT hat. Also ...
Craig Hicks
3

Der Zeitstempel ist in utc immer die Zeit. Wenn Sie ihn jedoch aufrufen datetime.datetime.fromtimestamp , wird die Zeit in Ihrer lokalen Zeitzone zurückgegeben, die diesem Zeitstempel entspricht. Das Ergebnis hängt also von Ihrem Gebietsschema ab.

>>> import time, datetime

>>> time.time()
1564494136.0434234

>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)

Es gibt schöne Bibliotheken arrowmit unterschiedlichem Verhalten. Im selben Fall wird Ihr Zeitobjekt mit der UTC-Zeitzone zurückgegeben.

>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>
Ryabchenko Alexander
quelle