Ich habe ein Python- datetime
Objekt, das ich seit der Epoche 1970 in Unix-Zeit oder Sekunden / Millisekunden konvertieren möchte.
Wie mache ich das?
$ python -c 'import time; print(time.time())'
1584487455.698623
Ich habe ein Python- datetime
Objekt, das ich seit der Epoche 1970 in Unix-Zeit oder Sekunden / Millisekunden konvertieren möchte.
Wie mache ich das?
$ python -c 'import time; print(time.time())'
1584487455.698623
Antworten:
Es scheint mir, dass der einfachste Weg, dies zu tun, ist
import datetime
epoch = datetime.datetime.utcfromtimestamp(0)
def unix_time_millis(dt):
return (dt - epoch).total_seconds() * 1000.0
%s
OS abhängig ist! Daher möchte jeder, der den Code zuverlässig funktioniert, unabhängig davon, auf welchem Betriebssystem, NIEMALS verwendet werden %s
. Für 2.3 <py ver <2.7. Man kann einfach so etwas bauen total_seconds()
:delta.days*86400+delta.seconds+delta.microseconds/1e6
dt
muss in UTC sein (nicht lokal). Siehe ähnliche Antwort mit Python 2.6 / 3-Unterstützung
utcfromtimestamp(0)
kann nur dann einen 'tz'-Offset verursachen, wenn' tz 'nicht 0 ist. Dies liegt daran, dass dt
in dt- epoch
' tz 'berechnet wurde, wobei die Epoche die UTC-Zeit ist. Der beste Weg, um die Epoche zu berechnen, epoch = datetime.datetime(1970, 1, 1)
ist die Berücksichtigung der Zeitzone.
datetime.utcfromtimestamp(0)
eine Datumszeit ohne tzinfo zurück? Es ist genau dort im Methodennamen utc fromtimestamp. Um es nicht naiv zu machen, muss ich so etwas tun datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)
. Dies ist notwendig, wenn dt
die Zeitzone bekannt ist, sonst erhalten SieTypeError: can't subtract offset-naive and offset-aware datetimes
In Python 3.3 wurde eine neue Methode hinzugefügt timestamp
:
import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()
Ihre Frage ergab, dass Sie Millisekunden benötigen, die Sie wie folgt erhalten können:
milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000
Wenn Sie timestamp
ein naives datetime-Objekt verwenden, wird davon ausgegangen, dass es sich in der lokalen Zeitzone befindet. Verwenden Sie zeitzonenabhängige datetime-Objekte, wenn dies nicht beabsichtigt ist.
.timestamp()
Methode wird davon ausgegangen, dass sich eine naive Eingabedatenzeit in der lokalen Zeitzone befindet (und die lokale Zeit möglicherweise nicht eindeutig ist). Wenn es in UTC ist, verwenden Sie dt.replace(tzinfo=timezone.utc).timestamp()
stattdessen .
datetime.datetime.timestamp(datetime.datetime.now())
datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()
aber nicht (immer) gleich datetime.datetime.now().timestamp()
(diese letzte ist nur gleich dem Rest, wenn der lokale tz UTC ist ...)
fromtimestamp
( docs.python.org/3/library/… )
>>> import datetime
>>> # replace datetime.datetime.now() with your datetime object
>>> int(datetime.datetime.now().strftime("%s")) * 1000
1312908481000
Oder die Hilfe des Zeitmoduls (und ohne Datumsformatierung):
>>> import datetime, time
>>> # replace datetime.datetime.now() with your datetime object
>>> time.mktime(datetime.datetime.now().timetuple()) * 1000
1312908681000.0
Beantwortet mit Hilfe von: http://pleac.sourceforge.net/pleac_python/datesandtimes.html
Dokumentation:
.timetuple()
gibt tm_isdst=-1
es zwingt mktime()
zu raten. Während der Sommerzeit kann es zu falschen Vermutungen kommen (50% Fehlerwahrscheinlichkeit +/- Stunde). Beide '% s' und verwenden mktime()
möglicherweise den falschen utc-Offset für Daten aus der Vergangenheit. Sie benötigen eine historische Zeitzonen-Datenbank, wie sie vom pytz
Modul bereitgestellt wird , um die Ortszeit zuverlässig in einen POSIX-Zeitstempel umzuwandeln (es sei denn, das Betriebssystem stellt bereits eine solche Datenbank bereit)
time.mktime(ts.timetuple())
Dabei ist ts das Datum / Uhrzeit-Objekt von Python
mktime/timetuple
. Außerdem werden timetuple()
Sekundenbruchteile entfernt, und der Punkt der Frage besteht darin, den Zeitstempel mit Millisekundengenauigkeit zu erhalten.
Mit Delorean können Sie in Raum und Zeit reisen!
import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch
So mache ich es:
from datetime import datetime
from time import mktime
dt = datetime.now()
sec_since_epoch = mktime(dt.timetuple()) + dt.microsecond/1000000.0
millis_since_epoch = sec_since_epoch * 1000
Empfehlungen aus den Python 2.7-Dokumenten für das time
Modul
time
Modul, aber das OP fragt nach dem datetime
Modul. FWIW, die einfachste aktuelle Epoche istint(time.time())
from datetime import datetime
from calendar import timegm
# Note: if you pass in a naive dttm object it's assumed to already be in UTC
def unix_time(dttm=None):
if dttm is None:
dttm = datetime.utcnow()
return timegm(dttm.utctimetuple())
print "Unix time now: %d" % unix_time()
print "Unix timestamp from an existing dttm: %d" % unix_time(datetime(2014, 12, 30, 12, 0))
timegm()
funktioniert nur mit utc zeit. Es wird nicht verwendet, tm_isdst
daher könnten Sie utcnow.timetuple()
stattdessen verwenden utcnow.utctimetuple()
. Hinweis: Die Verwendung naive_local_datetime.utctimetuple()
wäre hier falsch. Die Ortszeit wird nicht in utc übersetzt. Auch timetuple()
Streifen von Sekundenbruchteilen aus dem Ergebnis nennen (ob es wichtig ist, hängt von der Anwendung). Auch die Frage fragt nach * Milli * Sekunden, nicht Sekunden
utctimetuple()
Streifen Bruchteile einer Sekunde. Das Multiplizieren mit 1000
bringt sie nicht zurück.
>>> import datetime
>>> import time
>>> import calendar
>>> #your datetime object
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2013, 3, 19, 13, 0, 9, 351812)
>>> #use datetime module's timetuple method to get a `time.struct_time` object.[1]
>>> tt = datetime.datetime.timetuple(now)
>>> tt
time.struct_time(tm_year=2013, tm_mon=3, tm_mday=19, tm_hour=13, tm_min=0, tm_sec=9, tm_wday=1, tm_yday=78, tm_isdst=-1)
>>> #If your datetime object is in utc you do this way. [2](see the first table on docs)
>>> sec_epoch_utc = calendar.timegm(tt) * 1000
>>> sec_epoch_utc
1363698009
>>> #If your datetime object is in local timeformat you do this way
>>> sec_epoch_loc = time.mktime(tt) * 1000
>>> sec_epoch_loc
1363678209.0
[1] http://docs.python.org/2/library/datetime.html#datetime.date.timetuple
Hier ist eine andere Form einer Lösung mit Normalisierung Ihres Zeitobjekts:
def to_unix_time(timestamp):
epoch = datetime.datetime.utcfromtimestamp(0) # start of epoch time
my_time = datetime.datetime.strptime(timestamp, "%Y/%m/%d %H:%M:%S.%f") # plugin your time object
delta = my_time - epoch
return delta.total_seconds() * 1000.0
import time
seconds_since_epoch = time.mktime(your_datetime.timetuple()) * 1000
* 1000
, erhalten Sie seconds_since_epoch
. Diese Antwort zu verbessern, weil mir Millisekunden momentan egal sind.
Hier ist eine Funktion, die ich basierend auf der obigen Antwort gemacht habe
def getDateToEpoch(myDateTime):
res = (datetime.datetime(myDateTime.year,myDateTime.month,myDateTime.day,myDateTime.hour,myDateTime.minute,myDateTime.second) - datetime.datetime(1970,1,1)).total_seconds()
return res
Sie können den zurückgegebenen Wert wie folgt umbrechen: str (int (res)) Um ihn ohne einen Dezimalwert zurückzugeben, der als Zeichenfolge verwendet werden soll, oder nur int (ohne str)
Diese andere Lösung für verdeckte Datums- und Uhrzeitangaben zu unixtimestampmillis.
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long GetCurrentUnixTimestampMillis()
{
DateTime localDateTime, univDateTime;
localDateTime = DateTime.Now;
univDateTime = localDateTime.ToUniversalTime();
return (long)(univDateTime - UnixEpoch).TotalMilliseconds;
}