Convertir la hora de la época en fecha y hora

303

Recibo una respuesta del resto es un formato de hora de época como

start_time = 1234566
end_time = 1234578

Quiero convertir esos segundos de época en tiempo de formato MySQL para poder almacenar las diferencias en mi base de datos MySQL.

Lo intenté:

>>> import time
>>> time.gmtime(123456)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=10, tm_min=17, tm_sec=36, tm_wday=4, tm_yday=2, tm_isdst=0)

El resultado anterior no es lo que estoy esperando. Quiero que sea como

2012-09-12 21:00:00

Por favor sugiera cómo puedo lograr esto?

Además, ¿por qué estoy TypeError: a float is requiredbuscando

>>> getbbb_class.end_time = 1347516459425
>>> mend = time.gmtime(getbbb_class.end_time).tm_hour
Traceback (most recent call last):
  ...
TypeError: a float is required
usuario1667633
fuente
¿Estás seguro 1347516459425? Esta no es una época válida. Intenta time.gmtime(float(str(i)[:-6]+'.'+str(i)[-6:]))donde iestá 1347516459425.
Burhan Khalid
@Burhan ¿Cómo descubriste que esta no es una Época válida?
user1667633
2
Porque una época solo está en el rango de ~ 10¹⁰. Intente usar time.ctime (1347516459.425), esto le dará el 13 de septiembre del 12. Cuidado con el decimal.
Pax Vobiscum
77
Por favor, deja de llamarlo "tiempo de época" cuando te refieres a Unix Time . Ha habido muchas épocas diferentes utilizadas en informática .
Matt Johnson-Pint
Solía ​​tomar epoch = unix = posix ... gracias por señalarlo.
Ben

Respuestas:

354

Para convertir su valor de tiempo (float o int) en una cadena con formato, use:

time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1347517370))
Ron Rothman
fuente
3
time.strftime ('% Y-% m-% d% H:% M:% S', time.localtime (1347517491247)) '44671-02-17 11:44:07' ¿por qué?
user1667633
3
¿De dónde vino el tiempo "1347517491247" en tu ejemplo? ¿Es un valor en tiempo real lo que estás usando?
Ron Rothman
En realidad estoy consiguiendo que el valor del servidor BigBlueButton
user1667633
20
time.strftime ('% Y-% m-% d% H:% M:% S', time.localtime (1347517491.247)) '2012-09-13 08:24:51' Su valor es época en ms
MatthieuW
1
ver docs.python.org/2/library/time.html#time.strftime para más información en la cadena de formato
georg
221

También puedes usar datetime:

>>> import datetime
>>> datetime.datetime.fromtimestamp(1347517370).strftime('%c')
  '2012-09-13 02:22:50'
png
fuente
3
en qué zona horaria convierte esto, ¿y si quiero estar en una zona horaria específica? ?
garg10may
44
@ garg10may el tiempo de época siempre es el desplazamiento UTC 0, por lo que la cadena también sería el desplazamiento UTC 0. Esto es equivalente a la zona horaria zulú (+00: 00). Puede leer más aquí: timeanddate.com/time/zones/z
Devnetics
66
Hay una función 'utcfromtimestamp' para obtener la hora UTC en python 3.
vwvolodya
La ventaja de usar esta respuesta es que la versión de fecha y hora strftime()admite más marcadores de posición de formato, particularmente% f para la porción de microsegundos de la hora. Por razones desconocidas, time.strftime()no admite eso, aunque los microsegundos se pueden representar en el valor flotante al que se ingresa time.localtime().
Andreas Maier
60
>>> import datetime
>>> datetime.datetime.fromtimestamp(1347517370).strftime('%Y-%m-%d %H:%M:%S')
'2012-09-13 14:22:50' # Local time

Para obtener UTC:

>>> datetime.datetime.utcfromtimestamp(1347517370).strftime('%Y-%m-%d %H:%M:%S')
  '2012-09-13 06:22:50'
usuario799188
fuente
doc dice que prefiere ex
qrtLs
14

Esto es lo que necesitas

In [1]: time.time()
Out[1]: 1347517739.44904

In [2]: time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time()))
Out[2]: '2012-09-13 06:31:43'

Ingrese un en floatlugar de un inty ese otro TypeErrordebería desaparecer.

mend = time.gmtime(float(getbbb_class.end_time)).tm_hour
ronak
fuente
10

Prueba esto:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(1347517119))
'2012-09-12 23:18:39'

También en MySQL, puede FROM_UNIXTIMEgustar:

INSERT INTO tblname VALUES (FROM_UNIXTIME(1347517119))

Para su segunda pregunta, probablemente sea porque getbbb_class.end_timees una cadena. Puede convertirlo a numérico como:float(getbbb_class.end_time)

dkamins
fuente
8
#This adds 10 seconds from now.
from datetime import datetime
import commands

date_string_command="date +%s"
utc = commands.getoutput(date_string_command)
a_date=datetime.fromtimestamp(float(int(utc))).strftime('%Y-%m-%d %H:%M:%S')
print('a_date:'+a_date)
utc = int(utc)+10
b_date=datetime.fromtimestamp(float(utc)).strftime('%Y-%m-%d %H:%M:%S')
print('b_date:'+b_date)

Esto es un poco más prolijo, pero proviene del comando date en unix.

usuario2899300
fuente
3

Primero un poco de información en época de man gmtime

The ctime(), gmtime() and localtime() functions all take an argument of data type time_t which represents calendar  time.   When  inter-
       preted  as  an absolute time value, it represents the number of seconds elapsed since 00:00:00 on January 1, 1970, Coordinated Universal
       Time (UTC).

para entender cómo debería ser la época.

>>> time.time()
1347517171.6514659
>>> time.gmtime(time.time())
(2012, 9, 13, 6, 19, 34, 3, 257, 0)

solo asegúrate de que el argumento al que estás pasando time.gmtime()sea ​​entero.

tuxuday
fuente