Tengo un archivo En Python, me gustaría tomar su tiempo de creación y convertirlo a una cadena de tiempo ISO (ISO 8601) mientras preservo el hecho de que se creó en la Zona Horaria del Este (ET) .
¿Cómo tomo el ctime del archivo y lo convierto en una cadena de tiempo ISO que indica la zona horaria del este (y tiene en cuenta el horario de verano, si es necesario)?
Respuestas:
Local según ISO 8601:
UTC a ISO 8601:
Local a ISO 8601 sin microsegundo:
UTC a ISO 8601 con información de TimeZone (Python 3):
UTC a ISO 8601 con información de zona horaria local sin microsegundos (Python 3):
Local a ISO 8601 con información de TimeZone (Python 3):
Observe que hay un error cuando se usa
astimezone()
en tiempo utc. Esto da un resultado incorrecto:Para Python 2, vea y use pytz .
fuente
.isoformat()
puede tomar un parámetro separador, (en caso de que desee algo diferente a 'T'):.isoformat(' ')
It is permitted to omit the 'T' character by mutual agreement.
Esto es lo que uso para convertir al formato de fecha y hora XSD:
Encontré esta pregunta cuando buscaba el formato de fecha y hora XSD (
xs:dateTime
). Necesitaba eliminar los microsegundos deisoformat
.fuente
xs:date
a las hojas de estilo XSD / XML.xs:dateTime
Representación de tiempo ISO 8601
El estándar internacional ISO 8601 describe una representación de cadena para fechas y horas. Dos ejemplos simples de este formato son
(que representan el 16 de diciembre de 2010), pero el formato también permite tiempos de resolución inferiores a un segundo y especificar zonas horarias. Por supuesto, este formato no es específico de Python, pero es bueno para almacenar fechas y horas en un formato portátil. Los detalles sobre este formato se pueden encontrar en la entrada Markus Kuhn .
Recomiendo el uso de este formato para almacenar tiempos en archivos.
Una forma de obtener el tiempo actual en esta representación es usar strftime del módulo de tiempo en la biblioteca estándar de Python:
Puede usar el constructor strptime de la clase datetime:
El más robusto es el módulo Egenix mxDateTime:
Referencias
La documentación del módulo de tiempo de Python
La documentación de la clase de fecha y hora de Python
La clase mxDateTime de Egenix
fuente
2018-05-25
2018-05-25T12:16:14+00:00
2018-05-25T12:16:14Z
20180525T121614Z
Encontré el datetime.isoformat en la documentación . Parece hacer lo que quieres:
fuente
ISO 8601 permite una representación compacta sin separadores, excepto el
T
, por lo que me gusta usar esta línea para obtener una cadena de marca de tiempo rápida:Si no necesita los microsegundos, simplemente omita la
.%f
parte:Para hora local:
Editar:
Después de leer esto un poco más, le recomiendo que deje la puntuación en. RFC 3339 recomienda ese estilo porque si todos usan la puntuación, no hay riesgo de que varias cadenas ISO 8601 se ordenen en grupos según su puntuación. Entonces, el único revestimiento para una cadena compatible sería:
fuente
2019-02-23T04:02:04.051Z
connew Date().toISOString()
El formato de hora ISO 8601 no almacena un nombre de zona horaria, solo se conserva el desplazamiento UTC correspondiente.
Para convertir un archivo ctime en una cadena de tiempo ISO 8601 mientras se preserva el desplazamiento UTC en Python 3:
El código asume que su zona horaria local es Zona Horaria del Este (ET) y que su sistema proporciona un desplazamiento UTC correcto para la marca de tiempo POSIX dada (
ts
), es decir, Python tiene acceso a una base de datos histórica de zonas horarias en su sistema o la zona horaria tenía el mismas reglas en una fecha dada.Si necesita una solución portátil; use el
pytz
módulo que proporciona acceso a la base de datos tz :El resultado es el mismo en este caso.
Si necesita el nombre / abreviatura / identificación de zona horaria, almacénelo por separado.
Nota: no,
:
en el desplazamiento UTC y laEST
abreviatura de zona horaria no forma parte del formato de hora ISO 8601. No es unico.Diferentes bibliotecas / diferentes versiones de la misma biblioteca pueden usar diferentes reglas de zona horaria para la misma fecha / zona horaria. Si es una fecha futura, entonces las reglas pueden ser desconocidas todavía. En otras palabras, la misma hora UTC puede corresponder a una hora local diferente dependiendo de las reglas que use: guardar una hora en formato ISO 8601 conserva la hora UTC y la hora local que corresponde a las reglas de zona horaria actuales en uso en su plataforma . Es posible que deba volver a calcular la hora local en una plataforma diferente si tiene reglas diferentes.
fuente
Tendrá que usar
os.stat
para obtener el tiempo de creación del archivo y una combinación detime.strftime
ytime.timezone
para formatear:fuente
Corrígeme si estoy equivocado (no lo estoy), pero el desplazamiento de UTC cambia con el horario de verano. Entonces deberías usar
También creo que el signo debería ser diferente:
Podría estar equivocado, pero no lo creo.
fuente
Estoy de acuerdo con Jarek, y además noto que el carácter separador de desplazamiento ISO es dos puntos, así que creo que la respuesta final debería ser:
fuente
Agregar una pequeña variación a la excelente respuesta de estani
Local a ISO 8601 con TimeZone y sin información de microsegundos (Python 3):
Salida de muestra:
Probado que esta salida puede ser analizada por Javascript
Date
y C #DateTime
/DateTimeOffset
fuente
He desarrollado esta función:
fuente
fuente