Gibt time.time()
das Python-Zeitmodul die Systemzeit oder die Zeit in UTC zurück?
Gibt time.time()
das Python-Zeitmodul die Systemzeit oder die Zeit in UTC zurück?
Antworten:
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 ts
Variable ist die in Sekunden zurückgegebene Zeit. Ich habe es dann mithilfe der datetime
Bibliothek in eine Zeichenfolge konvertiert, sodass es für Menschen lesbar ist.
import time
wenn datetime Ihnen im Grunde einen Zeitstempel gibt? Entfernen Sie einfach die Millisekunden -str(datetime.datetime.now()).split('.')[0]
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).
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 now
unterscheiden sich von utcnow
den 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
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())
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.
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.
type(time.time())
gibt<type 'float'>
int()
ist polymorph. Bei long
alten Python-Versionen wird es bei Bedarf zurückgegeben - bei neuen Python-Versionen sind alle Ganzzahlen lang.
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?
datetime.utcfromtimestamp
während es 308 positive Stimmen für eine Antwort mit datetime.fromtimestamp
:-(
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).
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.
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.
Ich entschied mich schließlich für:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
time.time()
Gibt Dezimal / Float-ähnlich zurück 1574115250.818733
und Millisekunden seit Epoche ist leicht int(time.time() * 1000)
zB1574115254915
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.
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 arrow
mit 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]>