Estoy agregando cadenas de tiempo UTC a las respuestas de API de Bitbucket que actualmente solo contienen cadenas de tiempo de Amsterdam (!). Para mantener la coherencia con las cadenas de tiempo UTC devueltas en otro lugar, el formato deseado es 2011-11-03 11:07:04
(seguido de+00:00
, pero no es pertinente).
¿Cuál es la mejor manera de crear una cadena de este tipo ( sin un componente de microsegundos) a partir de una datetime
instancia con un componente de microsegundos?
>>> import datetime
>>> print unicode(datetime.datetime.now())
2011-11-03 11:13:39.278026
Agregaré la mejor opción que se me haya ocurrido como una posible respuesta, pero puede haber una solución más elegante.
Editar: debo mencionar que en realidad no estoy imprimiendo la hora actual; solía datetime.now
proporcionar un ejemplo rápido. Por lo tanto, la solución no debe suponer que cualquier datetime
instancia que reciba incluirá componentes de microsegundos.
fuente
.isoformat()
, que incluye los microsegundos de forma predeterminada. Si eso es lo que necesita, sea explícito al respecto. Todos entenderán de inmediato lo que hace este código. Casi nadie entenderá el otro código sin mirar la documentación.fuente
.isoformat([sep])
- Devuelve una cadena que representa la fecha y la hora en formato ISO 8601, AAAA-MM-DDTHH: MM: SS.mmmmmm o, si microsegundo es 0, AAAA-MM-DDTHH: MM: SS "En Python 3.6:
https://docs.python.org/3.6/library/datetime.html#datetime.datetime.isoformat
fuente
Así es como lo hago. Formato ISO:
Puede reemplazar la 'T' si no desea el formato ISO:
fuente
.isoformat()
másunicode()
?unicode()
, y si desea ISO-8601, useisoformat()
unicode()
Es más conveniente que.isoformat().replace('T', ' ')
, sin duda. ;)isoformat
acepta el separador especificador, por lo que no se debe reemplazar. acaba de hacer:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
Otra opción más:
Por defecto, esto usa la hora local, si necesita UTC puede usar lo siguiente:
fuente
Mantenga los primeros 19 caracteres que deseaba mediante el corte:
fuente
+05:30
. Correcto seríastr(now())[:19]
.10000
, una segunda será echado de menosYo suelo hacer:
salida:
fuente
Como no todas las
datetime.datetime
instancias tienen un componente de microsegundos (es decir, cuando es cero), puede dividir la cadena en un "." y tome solo el primer elemento, que siempre funcionará:fuente
Podemos probar algo como a continuación
fuente
.isoformat(' ', 'seconds')
, propuesto en una respuesta anterior.Encontré que esta es la forma más simple.
fuente
Esto lo uso porque puedo entenderlo y, por lo tanto, recordarlo mejor (y el formato de fecha y hora también se puede personalizar según su elección):
fuente