from example create python datetime iso8601

example - Tiempo ISO(ISO 8601) en Python?



timedelta python example (10)

Tengo un archivo. En Python, me gustaría tomar su tiempo de creación, y convertirlo a una cadena de tiempo ISO (ISO 8601) conservando el hecho de que fue creado en la Zona Horaria del Este .

¿Cómo tomo el tiempo del archivo y lo convierto en una cadena de tiempo ISO, que indica la zona horaria del este (y toma en cuenta el horario de verano, si es necesario)?


Corrígeme si estoy equivocado (no lo estoy), pero el desplazamiento de UTC cambia con el horario de verano. Entonces deberías usar

tz = str.format(''{0:+06.2f}'', float(time.altzone) / 3600)

También creo que el signo debería ser diferente

tz = str.format(''{0:+06.2f}'', -float(time.altzone) / 3600)

Podría estar equivocado, pero no lo creo


Desarrollé esta función:

def iso_8601_format(dt): """YYYY-MM-DDThh:mm:ssTZD (1997-07-16T19:20:30-03:00)""" if dt is None: return "" fmt_datetime = dt.strftime(''%Y-%m-%dT%H:%M:%S'') tz = dt.utcoffset() if tz is None: fmt_timezone = "+00:00" else: fmt_timezone = str.format(''{0:+06.2f}'', float(tz.total_seconds() / 3600)) return fmt_datetime + fmt_timezone


Encontré el datetime.isoformat en el doc ; parece hacer lo que quieras:

datetime.isoformat([sep]) Return a string representing the date and time in ISO 8601 format, YYYY-MM-DDTHH:MM:SS.mmmmmm or, if microsecond is 0, YYYY-MM-DDTHH:MM:SS If utcoffset() does not return None, a 6-character string is appended, giving the UTC offset in (signed) hours and minutes: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM or, if microsecond is 0 YYYY-MM-DDTHH:MM:SS+HH:MM The optional argument sep (default ''T'') is a one-character separator, placed between the date and time portions of the result. For example, >>> >>> from datetime import tzinfo, timedelta, datetime >>> class TZ(tzinfo): ... def utcoffset(self, dt): return timedelta(minutes=-399) ... >>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat('' '') ''2002-12-25 00:00:00-06:39''


Esto es lo que uso para convertir al formato de fecha y hora de XSD:

from datetime import datetime datetime.now().replace(microsecond=0).isoformat() # You get your iso string

Me encontré con esta pregunta cuando busqué el formato de fecha y hora de XSD. Necesitaba eliminar los microsegundos de isoformat . ¡Aclamaciones!


Estoy de acuerdo con Jarek, y además observo que el carácter separador de desplazamiento ISO es un punto, así que creo que la respuesta final debería ser:

isodate.datetime_isoformat(datetime.datetime.now()) + str.format(''{0:+06.2f}'', -float(time.timezone) / 3600).replace(''.'', '':'')


Local a ISO-8601:

import datetime datetime.datetime.now().isoformat()

UTC a ISO-8601:

import datetime datetime.datetime.utcnow().isoformat()

Local a ISO-8601 sin microsegundo:

import datetime datetime.datetime.now().replace(microsecond=0).isoformat()

UTC a ISO-8601 con TimeZone info (python 3):

import datetime datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()

Local a ISO-8601 con TimeZone info (python 3):

import datetime, time # calculate the offset taking into account daylight saving time utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone utc_offset = datetime.timedelta(seconds=-utc_offset_sec) datetime.datetime.now().replace(tzinfo=datetime.timezone(offset=utc_offset)).isoformat()

Para python 2, vea y use pytz


Tendrá que usar os.stat para obtener la hora de creación del archivo y una combinación de time.strftime y time.timezone para formatear:

>>> import time >>> import os >>> t = os.stat(''C:/Path/To/File.txt'').st_ctime >>> t = time.localtime(t) >>> formatted = time.strftime(''%Y-%m-%d %H:%M:%S'', t) >>> tz = str.format(''{0:+06.2f}'', float(time.timezone) / 3600) >>> final = formatted + tz >>> >>> final ''2008-11-24 14:46:08-02.00''

EDITAR: Cambió de gmtime() a localtime() .


El formato de hora ISO8601 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 conserva el desplazamiento utc en Python 3:

>>> import os >>> from datetime import datetime, timezone >>> ts = os.path.getctime(some_file) >>> dt = datetime.fromtimestamp(ts, timezone.utc) >>> dt.astimezone().isoformat() ''2015-11-27T00:29:06.839600-05:00''

El código asume que su zona horaria local es Eastern Time Zone y que su sistema proporciona un desplazamiento UTC correcto para la marca de tiempo ( ts ) POSIX dada, es decir, python tiene acceso a una base de datos histórica de timezone en su sistema o la zona horaria tiene las mismas reglas en una fecha determinada.

Si necesita una solución portátil; use el módulo de pytz que proporciona acceso a la base de datos tz :

>>> import os >>> from datetime import datetime >>> import pytz # pip install pytz >>> ts = os.path.getctime(some_file) >>> dt = datetime.fromtimestamp(ts, pytz.timezone(''America/New_York'')) >>> dt.isoformat() ''2015-11-27T00:29:06.839600-05:00''

El resultado es el mismo en este caso.

Si necesita el nombre de la zona horaria / abreviatura / identificación de zona; almacenarlo por separado.

>>> dt.astimezone().strftime(''%Y-%m-%d %H:%M:%S%z (%Z)'') ''2015-11-27 00:29:06-0500 (EST)''

Nota: no : en el desplazamiento utc y la abreviatura de zona horaria EST no es parte del formato de hora ISO8601. No es único.

Diferentes bibliotecas / diferentes versiones de la misma biblioteca pueden usar diferentes reglas de zona horaria para la misma fecha / zona horaria. Si se trata de una fecha futura, las reglas aún podrían ser desconocidas. En otras palabras, la misma hora UTC puede corresponder a una hora local diferente según las reglas que use; al guardar una hora en formato ISO8601 se conserva la hora UTC y la hora local que corresponde a las reglas actuales de la zona horaria en uso en su plataforma. Es posible que necesite volver a calcular la hora local en una plataforma diferente si tiene reglas diferentes.


Representación del 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

2010-12-16 17:22:15 20101216T172215

(que representan el 16 de diciembre de 2010), pero el formato también permite tiempos de resolución por debajo del segundo y para especificar zonas horarias. Este formato, por supuesto, 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 de Markus Kuhn

Recomiendo el uso de este formato para almacenar las horas en los archivos.

Una forma de obtener la hora actual en esta representación es usar strftime desde el módulo de tiempo en la biblioteca estándar de Python:

>>> from time import strftime >>> strftime("%Y-%m-%d %H:%M:%S") ''2010-03-03 21:16:45''

Puede usar el constructor strptime de la clase datetime:

>>> from datetime import datetime >>> datetime.strptime("2010-06-04 21:08:12", "%Y-%m-%d %H:%M:%S") datetime.datetime(2010, 6, 4, 21, 8, 12)

El más robusto es el módulo Egenix mxDateTime:

>>> from mx.DateTime.ISO import ParseDateTimeUTC >>> from datetime import datetime >>> x = ParseDateTimeUTC("2010-06-04 21:08:12") >>> datetime.fromtimestamp(x) datetime.datetime(2010, 3, 6, 21, 8, 12)

Referencias


import datetime, time def convert_enddate_to_seconds(self, ts): """Takes ISO 8601 format(string) and converts into epoch time.""" dt = datetime.datetime.strptime(ts[:-7],''%Y-%m-%dT%H:%M:%S.%f'')+/ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+''1'') seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0 return seconds >>> import datetime, time >>> ts = ''2012-09-30T15:31:50.262-08:00'' >>> dt = datetime.datetime.strptime(ts[:-7],''%Y-%m-%dT%H:%M:%S.%f'')+ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+''1'') >>> seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0 >>> seconds 1348990310.26