from - timedelta python example
El formato ISO del objeto Python UTC datetime no incluye Z(desplazamiento Zulu o Zero) (4)
Opción: isoformat()
La datetime
y datetime
de Python no admite los sufijos militares de la zona horaria como el sufijo ''Z'' para UTC. El siguiente reemplazo de cadena simple es el truco:
In [1]: import datetime
In [2]: d = datetime.datetime(2014, 12, 10, 12, 0, 0)
In [3]: str(d).replace(''+00:00'', ''Z'')
Out[3]: ''2014-12-10 12:00:00Z''
str(d)
es esencialmente lo mismo que d.isoformat(sep='' '')
Ver: Fecha y hora, Biblioteca estándar de Python
Opción: strftime()
O puede usar strftime
para lograr el mismo efecto:
In [4]: d.strftime(''%Y-%m-%d %H:%M:%SZ'')
Out[4]: ''2014-12-10 12:00:00Z''
Nota: Esta opción solo funciona cuando sabe que la fecha especificada está en UTC.
Adicional: Huso horario legible por humanos
Yendo más lejos, puede interesarle mostrar la información de la zona horaria legible por humanos, pytz
con strftime
zona horaria %Z
strftime
:
In [5]: import pytz
In [6]: d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=pytz.utc)
In [7]: d
Out[7]: datetime.datetime(2014, 12, 10, 12, 0, tzinfo=<UTC>)
In [8]: d.strftime(''%Y-%m-%d %H:%M:%S %Z'')
Out[8]: ''2014-12-10 12:00:00 UTC''
¿Por qué Python 2.7 no incluye caracteres Z (Zulu o desplazamiento cero) al final de la cadena isoformat del objeto datetime de UTC a diferencia de JavaScript?
>>> datetime.datetime.utcnow().isoformat()
''2013-10-29T09:14:03.895210''
Mientras que en javascript
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
Al combinar todas las respuestas anteriores, vine con la siguiente función:
from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
def tzname(self,**kwargs):
return "UTC"
def utcoffset(self, dt):
return timedelta(0)
def getdata(yy, mm, dd, h, m, s) :
d = datetime(yy, mm, dd, h, m, s)
d = d.replace(tzinfo=simple_utc()).isoformat()
d = str(d).replace(''+00:00'', ''Z'')
return d
print getdata(2018, 02, 03, 15, 0, 14)
Los objetos de datetime
Python no tienen información de zona horaria de forma predeterminada, y sin ella, Python en realidad infringe la especificación ISO 8601 ( si no se proporciona información de zona horaria, se supone que es hora local ). Puede usar el paquete de pytz para obtener algunas zonas horarias predeterminadas, o directamente la subclase tzinfo
:
from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
def tzname(self,**kwargs):
return "UTC"
def utcoffset(self, dt):
return timedelta(0)
Luego puede agregar manualmente la información de la zona horaria a utcnow()
:
>>> datetime.utcnow().replace(tzinfo=simple_utc()).isoformat()
''2014-05-16T22:51:53.015001+00:00''
Tenga en cuenta que esto cumple con el formato ISO 8601, que permite Z
o +00:00
como sufijo para UTC. Tenga en cuenta que este último en realidad se ajusta mejor al estándar, con la forma en que se representan las zonas horarias en general (UTC es un caso especial).
Python las fechas son un poco torpes. Usa la arrow
> str(arrow.utcnow())
''2014-05-17T01:18:47.944126+00:00''
Arrow tiene esencialmente la misma API que la fecha, pero con zonas horarias y algunas sutilezas adicionales que deberían estar en la biblioteca principal.