Conversión de una cadena de marca de tiempo de Unix a una fecha legible
Tengo una cadena que representa una marca de tiempo de Unix (es decir, "1284101485") en Python y me gustaría convertirla a una fecha legible. Cuando lo uso time.strftime
, obtengo un TypeError
:
>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str
Módulo de uso datetime
:
from datetime import datetime
ts = int('1284101485')
# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)
Tomado de http://seehuhn.de/pages/pdate
La respuesta más votada sugiere usar fromtimestamp, que es propenso a errores ya que usa la zona horaria local. Para evitar problemas, un mejor enfoque es utilizar UTC:
datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')
Donde posix_time es el tiempo de época Posix que desea convertir
Hay dos partes:
- Convierta la marca de tiempo de Unix ("segundos desde la época") a la hora local
- Muestra la hora local en el formato deseado.
Una forma portátil de obtener la hora local que funciona incluso si la zona horaria local tuvo un desplazamiento utc diferente en el pasado y Python no tiene acceso a la base de datos tz es usar una pytz
zona horaria:
#!/usr/bin/env python
from datetime import datetime
import tzlocal # $ pip install tzlocal
unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)
Para mostrarlo, puede utilizar cualquier formato de hora compatible con su sistema, por ejemplo:
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y")) # print date in your format
Si no necesita una hora local, para obtener una hora UTC legible:
utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))
Si no le importan los problemas de zona horaria que podrían afectar la fecha que se devuelve o si Python tiene acceso a la base de datos tz en su sistema:
local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))
En Python 3, puede obtener una fecha y hora que tenga en cuenta la zona horaria usando solo stdlib (el desplazamiento UTC puede ser incorrecto si Python no tiene acceso a la base de datos tz en su sistema, por ejemplo, en Windows):
#!/usr/bin/env python3
from datetime import datetime, timezone
utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
Las funciones del time
módulo son envoltorios finos alrededor de la API C correspondiente y, por lo tanto, pueden ser menos portátiles que los datetime
métodos correspondientes; de lo contrario, también podrías usarlos:
#!/usr/bin/env python
import time
unix_timestamp = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time))
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))
>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'