Estou adicionando cadeias de tempo UTC às respostas da API do Bitbucket que atualmente contêm apenas cadeias de tempo de Amsterdã (!). Para consistência com as seqüências de tempo UTC retornadas em outro local, o formato desejado é 2011-11-03 11:07:04
(seguido por +00:00
, mas isso não é relevante).
Qual é a melhor maneira de criar uma string ( sem um componente de microssegundo) a partir de uma datetime
instância com um componente de microssegundo?
>>> import datetime
>>> print unicode(datetime.datetime.now())
2011-11-03 11:13:39.278026
Acrescentarei a melhor opção que me ocorreu como uma resposta possível, mas pode muito bem haver uma solução mais elegante.
Editar: devo mencionar que não estou realmente imprimindo a hora atual - costumava datetime.now
fornecer um exemplo rápido. Portanto, a solução não deve assumir que quaisquer datetime
instâncias recebidas incluirão componentes de microssegundos.
fonte
.isoformat()
, que inclui os microssegundos por padrão. Se é disso que você precisa, seja explícito. Todos entenderão imediatamente o que esse código faz. Dificilmente alguém entenderá o outro código sem consultar a documentação.fonte
.isoformat([sep])
- Retorna uma string que representa a data e a hora no formato ISO 8601, AAAA-MM-DDTHH: MM: SS.mmmmmm ou, se o microssegundo é 0, AAAA-MM-DDTHH: MM: SS "No Python 3.6:
https://docs.python.org/3.6/library/datetime.html#datetime.datetime.isoformat
fonte
É assim que eu faço. Formato ISO:
Você pode substituir o 'T' se não quiser o formato ISO:
fonte
.isoformat()
maisunicode()
?unicode()
e se deseja ISO-8601, useisoformat()
unicode()
é mais conveniente do que.isoformat().replace('T', ' ')
, certamente. ;)isoformat
aceita o especificador separador, portanto, nenhuma substituição deve ser feita. apenas faça:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
Mais uma opção:
Por padrão, isso usa a hora local; se você precisar do UTC, pode usar o seguinte:
fonte
Mantenha os 19 primeiros caracteres que você queria por meio do fatiamento:
fonte
+05:30
. Correto seriastr(now())[:19]
.10000
, um segundo será perdidoEu costumo fazer:
resultado:
fonte
Como nem todas as
datetime.datetime
instâncias têm um componente de microssegundo (ou seja, quando é zero), você pode particionar a string em um "." e pegue apenas o primeiro item, que sempre funcionará:fonte
Podemos tentar algo como abaixo
fonte
.isoformat(' ', 'seconds')
, proposto em uma resposta anterior.Eu achei que essa era a maneira mais simples.
fonte
Isso eu uso porque posso entender e, portanto, me lembrar melhor (e o formato de data e hora também pode ser personalizado com base em sua escolha): -
fonte