¿Por qué Python 2.7 no incluye el carácter Z (Zulu o desplazamiento cero) al final de la cadena de isoformato del objeto de fecha y hora 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
datetime.datetime.utcnow().isoformat() + 'Z'
Respuestas:
Los
datetime
objetos de Python no tienen información de zona horaria de forma predeterminada, y sin ella, Python en realidad viola la especificación ISO 8601 ( si no se proporciona información de zona horaria, se supone que es la hora local ). Puede usar el paquete pytz para obtener algunas zonas horarias predeterminadas, o directamente subclasetzinfo
usted mismo:Luego, puede agregar manualmente la información de la zona horaria a
utcnow()
:Tenga en cuenta que esto SÍ se ajusta al 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).fuente
Z
lugar de+00:00
?pytz
viola eltzinfo
protocolo de Python y es peligroso de usar. Ver blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.htmldateutil
trabajar no se implementaron hasta Python 3.6 con PEP 495, por lo que decirpytz
que no usó la interfaz estándar es injusto porque la interfaz cambió. Antes del cambio, la única forma de hacerlo funcionar era la forma enpytz
que se hacía.Opción:
isoformat()
Python
datetime
no admite los sufijos de zona horaria militar como el sufijo 'Z' para UTC. El siguiente reemplazo de cadena simple hace el truco:str(d)
es esencialmente lo mismo qued.isoformat(sep=' ')
Ver: Fecha y hora, Biblioteca estándar de Python
Opción:
strftime()
O podría usar
strftime
para lograr el mismo efecto:Nota: Esta opción solo funciona cuando sabe que la fecha especificada está en UTC.
Ver: datetime.strftime ()
Adicional: Zona horaria legible por humanos
Yendo más allá, es posible que le interese mostrar información de zona horaria legible por humanos,
pytz
con lastrftime
%Z
bandera de zona horaria:fuente
T
lugar de un espacio en blanco?d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=datetime.timezone.utc)
en la línea 2. Por cierto , en RFC3339 dice que un espacio es 'ok' (en lugar de la 'T').Los siguientes scripts de javascript y python dan resultados idénticos. Creo que es lo que buscas.
JavaScript
Pitón
La salida que dan es la hora utc (zelda) formateada como una cadena ISO con un dígito significativo de 3 milisegundos y adjuntada con una Z.
fuente
En Python> = 3.2, simplemente puede usar esto:
fuente
Z
, puede recortar el desplazamiento:.isoformat()[:-6] + 'Z'
Las fechas de Python son un poco torpes. Utilice
arrow
.Arrow tiene esencialmente la misma API que datetime, pero con zonas horarias y algunas sutilezas adicionales que deberían estar en la biblioteca principal.
Un formato compatible con Javascript se puede lograr mediante:
Javascript
Date.parse
eliminará silenciosamente microsegundos de la marca de tiempo.fuente
Hay muchas buenas respuestas en la publicación, pero quería que el formato saliera exactamente como lo hace con JavaScript. Esto es lo que estoy usando y funciona bien.
fuente
fuente
Abordé este problema con algunos objetivos:
timezone
función de utilidad Django y eldateutil
analizadorEste enfoque no incluye un sufijo Z y no se usa
utcnow()
, pero se basa en la recomendación de la documentación de Python y se aprueba con Django y JavaScript.Comencemos pasando un objeto de zona horaria UTC en
datetime.now()
lugar de usardatetime.utcnow()
:Eso se ve bien, así que veamos qué es Django y
dateutil
pensemos:Bien, el objeto de fecha y hora de Python y la cadena ISO 8601 son "compatibles" con UTC. Ahora veamos qué piensa JavaScript de la cadena de fecha y hora. Tomando prestado de esta respuesta obtenemos:
Es posible que también desee leer esta publicación de blog .
fuente
Al combinar todas las respuestas anteriores, vine con la siguiente función:
fuente
Yo uso péndulo:
fuente
O, para obtenerlo de una sola vez:
fuente