Tengo un datetime
objeto Python que quiero convertir a tiempo unix, o segundos / milisegundos desde la época de 1970.
¿Cómo hago esto?
$ python -c 'import time; print(time.time())'
cuál dio:1584487455.698623
Tengo un datetime
objeto Python que quiero convertir a tiempo unix, o segundos / milisegundos desde la época de 1970.
¿Cómo hago esto?
$ python -c 'import time; print(time.time())'
cuál dio:1584487455.698623
Respuestas:
Me parece que la forma más sencilla de hacer esto es
import datetime
epoch = datetime.datetime.utcfromtimestamp(0)
def unix_time_millis(dt):
return (dt - epoch).total_seconds() * 1000.0
%s
depende del sistema operativo! Por lo tanto, cualquiera que quiera que el código funcione de manera confiable, independientemente de qué sistema operativo, NUNCA debe usar %s
. Para 2.3 <py ver <2.7. Simplemente se puede construir un total_seconds()
como este:delta.days*86400+delta.seconds+delta.microseconds/1e6
dt
debe estar en UTC (no local). Vea una respuesta similar con el soporte de Python 2.6 / 3
utcfromtimestamp(0)
puede causar un desplazamiento 'tz' solo si 'tz' no es 0. Esto se debe a que dt
en dt- epoch
'tz' se ha calculado en él, ya que la época es el tiempo UTC. La mejor manera de calcular la época es epoch = datetime.datetime(1970, 1, 1)
donde se considera la zona horaria.
datetime.utcfromtimestamp(0)
devuelve una fecha y hora sin tzinfo? Está justo ahí en el nombre del método, utc fromtimestamp. Para que no sea ingenuo, tengo que hacer algo así datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)
. Esto es necesario si dt
conoce la zona horaria o de lo contrario obtendráTypeError: can't subtract offset-naive and offset-aware datetimes
En Python 3.3, se agregó un nuevo método timestamp
:
import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()
Su pregunta decía que necesitaba milisegundos, que puede obtener así:
milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000
Si lo usa timestamp
en un objeto de fecha y hora ingenuo, se supone que está en la zona horaria local. Utilice objetos de fecha y hora con reconocimiento de zona horaria si esto no es lo que pretende que suceda.
.timestamp()
método supone que una fecha y hora de entrada ingenua se encuentra en la zona horaria local (y la hora local puede ser ambigua). Si está en UTC, use dt.replace(tzinfo=timezone.utc).timestamp()
en su lugar .
datetime.datetime.timestamp(datetime.datetime.now())
datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()
pero no (siempre) igual a datetime.datetime.now().timestamp()
(este último solo es igual al resto si el tz local es UTC ...)
fromtimestamp
( docs.python.org/3/library/… )
>>> import datetime
>>> # replace datetime.datetime.now() with your datetime object
>>> int(datetime.datetime.now().strftime("%s")) * 1000
1312908481000
O la ayuda del módulo de tiempo (y sin formato de fecha):
>>> import datetime, time
>>> # replace datetime.datetime.now() with your datetime object
>>> time.mktime(datetime.datetime.now().timetuple()) * 1000
1312908681000.0
Respondido con ayuda de: http://pleac.sourceforge.net/pleac_python/datesandtimes.html
Documentación:
.timetuple()
devuelve tm_isdst=-1
obliga mktime()
a adivinar. Puede adivinar erróneamente durante el horario de verano (50% de probabilidad de un error +/- hora). Ambos '% s' y mktime()
pueden usar el desplazamiento utc incorrecto para fechas del pasado. Necesita una base de datos histórica db como la proporcionada por el pytz
módulo para convertir de manera confiable la hora local a la marca de tiempo POSIX (a menos que el sistema operativo ya proporcione dicha base de datos)
time.mktime(ts.timetuple())
donde ts es el objeto de fecha y hora de python
mktime/timetuple
. También timetuple()
elimina fracciones de segundo y el punto de la pregunta es obtener la marca de tiempo con una precisión de milisegundos.
¡Puedes usar Delorean para viajar en el espacio y el tiempo!
import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch
Así es como lo hago:
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
Recomendaciones de los documentos de Python 2.7 para el time
módulo
time
módulo, pero el OP preguntó sobre el datetime
módulo. FWIW, la época actual más simple esint(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()
funciona solo con tiempo utc. No usa, tm_isdst
por lo tanto, podría usar en utcnow.timetuple()
lugar de utcnow.utctimetuple()
. Nota: usar naive_local_datetime.utctimetuple()
estaría mal aquí. No traduce la hora local a utc. También timetuple()
llame a las fracciones de tiras de un segundo del resultado (si importa depende de la aplicación). También la pregunta se refiere a * milli * segundos, no segundos
utctimetuple()
tiras de fracciones de segundo. Multiplicar por 1000
no los recuperará.
>>> 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
Aquí hay otra forma de solución con la normalización de su objeto de tiempo:
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
embargo, si eliminas , obtienes seconds_since_epoch
. Votar esta respuesta porque no me importan los milisegundos en este momento.
Aquí hay una función que hice basada en la respuesta anterior
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
Puede ajustar el valor devuelto de esta manera: str (int (res)) Para devolverlo sin un valor decimal para usarlo como cadena o simplemente int (sin el str)
Esta otra solución para datetime encubierto a 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;
}