¿Devuelve el time.time () de Python la marca de tiempo local o UTC?


562

¿ time.time()En el módulo de tiempo de Python devuelve la hora del sistema o la hora en UTC?


87
Las marcas de tiempo no tienen zonas horarias. Representan varios segundos desde la época. La época es un momento específico en el tiempo que no depende de la zona horaria.
jwg

2
@jwg: las marcas de tiempo POSIX de uso común no cuentan los segundos bisiestos y, por lo tanto, no son el "número de segundos [SI transcurridos] desde la época" (están cerca).
jfs

77
No creo que esta sea una objeción precisa @JFSebastian. Los segundos bisiestos no son 'segundos transcurridos desde la época'. Son cambios en las representaciones de tiempo registradas por relojes que no corresponden a segundos transcurridos.
jwg

44
@JFSebastian Perdón por la confusión. Los segundos bisiestos no son 'segundos transcurridos'. Por lo tanto, las marcas de tiempo, que son 'números de segundos transcurridos', no incluyen ni deben incluir segundos intercalares.
jwg

2
@jwg mal. No puedes borrar el tiempo físico. La marca de tiempo POSIX no es el número de segundos SI transcurridos. Aquí hay un ejemplo: transcurrieron 3 segundos entre el "31 de diciembre de 2016 a las 6:59:59 pm" y el "31 de diciembre de 2016 a las 7:00:01 pm" en Nueva York, pero la diferencia en las marcas de tiempo POSIX correspondientes es de solo 2 segundos (el el segundo salto no se cuenta).
jfs

Respuestas:


781

La time.time()función devuelve el número de segundos desde la época, como segundos. Tenga en cuenta que la "época" se define como el inicio del 1 de enero de 1970 en UTC. Entonces, la época se define en términos de UTC y establece un momento global en el tiempo. No importa dónde se encuentre "segundos después de la época" (time.time ()) devuelve el mismo valor en el mismo momento.

Aquí hay algunos resultados de muestra que ejecuté en mi computadora, convirtiéndolos también en una cadena.

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
>>>

La tsvariable es el tiempo devuelto en segundos. Luego lo convertí en una cadena usando la datetimebiblioteca, convirtiéndolo en una cadena que sea legible por humanos.


72
¿Por qué deberíamos import timecuando datetime básicamente le da una marca de tiempo? Simplemente quite los milisegundos -str(datetime.datetime.now()).split('.')[0]
Hussain

17
La época de @Alexis Unix se define claramente aquí . Incluso señala un ejemplo de Python a lo largo de la página. No entiendo tu comentario.
Squiguy

99
@squiguy para ser honesto, no recuerdo qué me hizo decir eso. Debí haber leído mal algo, y estaba luchando por descubrir por qué algunas pruebas se estaban rompiendo mientras me mudaba entre Francia y EE. UU. Para finalmente descubrir que el problema se debía al horario de verano que alarga la semana en este período del año. Lo siento y gracias por señalar esto.
Alexis

55
no son "segundos en UTC". . La marca de tiempo devuelta por time.time()no está en ninguna zona horaria . "segundos desde la época" es un término; no transcurren segundos desde algún punto en el tiempo (época). Puede convertirlo a su hora local (con la base de datos tz) y / o zona horaria UTC fácilmente. por cierto, si cae .strftime()el resultado es (casi) el mismo (+/- microsegundos).
jfs

3
acabo de probarlo, time.time () no da la hora UTC, da la hora de mi zona local
sliders_alpha

302

Esto es para la forma de texto de una marca de tiempo que se puede utilizar en sus archivos de texto. (El título de la pregunta era diferente en el pasado, por lo que la introducción de esta respuesta se cambió para aclarar cómo podría interpretarse como el momento. [Actualizado 2016-01-14])

Puede obtener la marca de tiempo como una cadena usando .now()o .utcnow()de datetime.datetime:

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

El nowdifiere de utcnowlo esperado; de lo contrario, funcionan de la misma manera:

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

Puede representar la marca de tiempo en la cadena explícitamente:

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

O puede ser aún más explícito para formatear la marca de tiempo de la manera que desee:

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

Si desea el formato ISO, use el .isoformat()método del objeto:

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

Puede usarlos en variables para realizar cálculos e imprimir sin conversiones.

>>> 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

1
Quería el tiempo de época ... no en formato de fecha ... como fue evidente por mi mención del tiempo de comando. Time ()
Saransh Mohapatra

34
Está bien, no hay problema. Alguien más puede necesitar una marca de tiempo para colocar en archivos de texto.
pepr

1
Soy otro, redirigido aquí probablemente debido a la cantidad irrazonable de votos a favor. La pregunta está mal formada y la respuesta aceptada es engañosa para la necesidad típica: obtener un sufijo legible para humanos, digamos para nombres de archivo, en la zona horaria del servidor más utilizada.

Para imprimir una marca de tiempo como parte de una cadena, use esto: Python2: import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE

datetime.datetime.utcnow()es malvado Crea una fecha y hora ingenua que no es la hora local. A menos que su hora local sea UTC, será INCORRECTO. Usar en su datetime.datetime.now(datetime.timezone.utc)lugar. Esto crea una fecha y hora consciente de la zona horaria que representa la hora actual.
Terrel Shumway

139

Basado en la respuesta de #squiguy, para obtener una marca de tiempo verdadera, escribiría cast from float.

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

Al menos ese es el concepto.


1
¿Cuál es la razón para encasillar la marca de tiempo? ¿Cuál es el tipo por defecto?
Tizzee

3
@Tizzee type(time.time())da<type 'float'>
famousgarkin

44
Pero si necesita un tiempo más preciso que en segundos, el flotador tiene sentido.
pepr

3
@RudiStrydom: Python está fuertemente tipado. No lo confundas con un tipo estático.
jfs

1
@CheokYanCheng: int()es polimórfico. Volvería longsi fuera necesario en las versiones antiguas de Python: todos los enteros son largos en las nuevas versiones de Python.
jfs

30

La respuesta podría ser ninguno o ambos.

  • ni: time.time()devuelve aproximadamente el número de segundos transcurridos desde la época. El resultado no depende de la zona horaria, por lo que no es ni UTC ni hora local. Aquí está la definición POSIX para "Segundos desde la época" .

  • ambos: time.time()no requiere que el reloj de su sistema esté sincronizado, por lo que refleja su valor (aunque no tiene nada que ver con la zona horaria local). Diferentes computadoras pueden obtener resultados diferentes al mismo tiempo. Por otro lado, si la hora de su computadora está sincronizada, es fácil obtener la hora UTC de la marca de tiempo (si ignoramos los segundos bisiestos):

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

Sobre cómo obtener marcas de tiempo desde la hora UTC en varias versiones de Python, consulte ¿Cómo puedo convertir una fecha a segundos desde la época según UTC?


44
Esta es la única respuesta que menciona correctamente datetime.utcfromtimestampmientras hay 308 votos a favor en una respuesta con datetime.fromtimestamp:-(

@TerrelShumway la pregunta es sobre qué time.time()devuelve la función (es muy corta). Su comentario aborda otra pregunta (ha cambiado su comentario desde que comencé a responderlo. Para peor). Una nota aparte; la palabra "correcto" debe usarse con moderación (las zonas horarias son complicadas, no hay una viñeta plateada, solo se intercambian para un caso de uso particular).
jfs

No utilice datetime.datetime.utcfromtimestamp(ts). A menos que su hora local sea UTC, será INCORRECTO, porque crea una fecha y hora ingenua que no es la hora local. Usar en su datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)lugar. Esto crea una fecha y hora consciente de la zona horaria que representa el mismo instante que la marca de tiempo.
Terrel Shumway

Si. Mi comentario anterior estaba completamente equivocado. La mayor parte del código en el módulo datetime trata las horas ingenuas como la hora local. Usar fechas y horas ingenuas es como abrir un archivo de texto sin conocer la codificación.
Terrel Shumway

@TerrelShumway Es un error suponer que la hora UTC solo se puede usar en sistemas donde es la hora local. Es cierto que algunas partes de stdlib tratan los objetos de fecha y hora ingenuos como si tuvieran la zona horaria local (lamentablemente). Preferiría que naive_dt.astimezone()no existiera como implícito bytes.encode()ya no existe en Python 3. Es cierto que es beneficioso trabajar internamente con el tiempo UTC en muchos casos. Hay muchas cosas que se pueden decir sobre el módulo de fecha y hora (he respondido suficientes preguntas para obtener una insignia de oro), la mayoría están fuera del alcance de la pregunta: qué time.time()devuelve.
jfs

4

Finalmente me conformé con:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0

1
Eso puede satisfacer sus necesidades locales, pero puede ser engañoso para las personas que esperan que los números en ese rango sean segundos desde la época [GMT]. time.time()devuelve decimal / flotante como 1574115250.818733y milisegundos-desde-época es fácil, int(time.time() * 1000)por ejemplo1574115254915
MarkHu

3

No existe una "época" en una zona horaria específica. La época está bien definida como un momento específico en el tiempo, por lo que si cambia la zona horaria, la hora también cambia. Específicamente, esta vez es Jan 1 1970 00:00:00 UTC. Entonces time.time()devuelve el número de segundos desde la época.


Si bien es cierto que UTC es un estándar de tiempo y no una zona horaria, el estándar es que comparte el mismo tiempo que GMT. Entonces ...
Craig Hicks

3

la marca de tiempo siempre es hora en utc, pero cuando la llama datetime.datetime.fromtimestamp devuelve la hora en su zona horaria local correspondiente a esta marca de tiempo, por lo que el resultado depende de su ubicación.

>>> 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)

Existe una buena biblioteca arrowcon diferentes comportamientos. En el mismo caso, devuelve su objeto de tiempo con la zona horaria UTC.

>>> 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]>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.