Conversión de una cadena de marca de tiempo de Unix a una fecha legible

Resuelto VeryNewToPython asked hace 14 años • 0 respuestas

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
VeryNewToPython avatar Sep 10 '10 13:09 VeryNewToPython
Aceptado

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'))
Michał Niklas avatar Sep 10 '2010 07:09 Michał Niklas
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

Tomado de http://seehuhn.de/pages/pdate

Daniel avatar Sep 10 '2010 06:09 Daniel

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

rkachach avatar May 12 '2016 13:05 rkachach

Hay dos partes:

  1. Convierta la marca de tiempo de Unix ("segundos desde la época") a la hora local
  2. 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 pytzzona 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 timemódulo son envoltorios finos alrededor de la API C correspondiente y, por lo tanto, pueden ser menos portátiles que los datetimemé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))  
jfs avatar Nov 23 '2016 16:11 jfs
>>> 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'
John La Rooy avatar Sep 10 '2010 08:09 John La Rooy