Por que o python 2.7 não inclui o caractere Z (Zulu ou deslocamento zero) no final da string de isoformato do objeto datetime UTC, ao contrário do JavaScript?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
Considerando que em javascript
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
datetime.datetime.utcnow().isoformat() + 'Z'
Respostas:
Os
datetime
objetos Python não têm informações de fuso horário por padrão e, sem elas, o Python realmente viola a especificação ISO 8601 ( se nenhuma informação de fuso horário for fornecida, presume-se que seja a hora local ). Você pode usar o pacote pytz para obter alguns fusos horários padrão ou criar suatzinfo
própria subclasse :Em seguida, você pode adicionar manualmente as informações de fuso horário a
utcnow()
:Observe que isso está de acordo com o formato ISO 8601, que permite tanto
Z
ou+00:00
como sufixo para UTC. Observe que o último na verdade está mais em conformidade com o padrão, com a forma como os fusos horários são representados em geral (UTC é um caso especial).fonte
Z
vez de+00:00
?pytz
viola otzinfo
protocolo do Python e é perigoso de usar! Consulte blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.htmldateutil
trabalho não foram implementadas até o Python 3.6 com PEP 495, então dizerpytz
que não usar a interface padrão é injusto porque a interface mudou. Antes da mudança, a única maneira de fazer funcionar era da mesma maneirapytz
.Opção:
isoformat()
O Python
datetime
não suporta os sufixos de fuso horário militares como o sufixo 'Z' para UTC. A seguinte substituição simples de string resolve:str(d)
é essencialmente o mesmo qued.isoformat(sep=' ')
Veja: Datetime, Python Standard Library
Opção:
strftime()
Ou você pode usar
strftime
para obter o mesmo efeito:Observação: esta opção funciona apenas quando você sabe que a data especificada está em UTC.
Veja: datetime.strftime ()
Adicional: fuso horário legível
Indo além, você pode estar interessado em exibir informações de fuso horário legíveis por humanos,
pytz
com astrftime
%Z
sinalização de fuso horário:fonte
T
em branco?d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=datetime.timezone.utc)
na linha 2. A propósito , em RFC3339 diz que um espaço é 'ok' (em vez do 'T').Os seguintes scripts javascript e python fornecem resultados idênticos. Acho que é o que você está procurando.
JavaScript
Pitão
A saída que eles fornecem é a hora utc (zelda) formatada como uma string ISO com um dígito significativo de 3 milissegundos e anexado com um Z.
fonte
Em Python> = 3.2, você pode simplesmente usar isto:
fonte
Z
, você pode cortar o deslocamento:.isoformat()[:-6] + 'Z'
Os datetimes do Python são um pouco desajeitados. Use
arrow
.Arrow tem essencialmente a mesma API que datetime, mas com fusos horários e algumas sutilezas extras que deveriam estar na biblioteca principal.
Um formato compatível com Javascript pode ser obtido por:
O Javascript
Date.parse
deixará silenciosamente os microssegundos do carimbo de data / hora.fonte
Há muitas respostas boas no post, mas eu queria que o formato saísse exatamente como no JavaScript. É isso que estou usando e funciona bem.
fonte
fonte
Abordei esse problema com alguns objetivos:
timezone
função de utilitário Django e odateutil
analisadorEssa abordagem não inclui um sufixo Z e não usa
utcnow()
, mas é baseada na recomendação da documentação do Python e é aprovada com Django e JavaScript.Vamos começar passando um objeto de fuso horário UTC para, em
datetime.now()
vez de usardatetime.utcnow()
:Isso parece bom, então vamos ver o que Django e
dateutil
pensar:Ok, o objeto datetime do Python e a string ISO 8601 são "cientes" do UTC. Agora, vamos ver o que o JavaScript pensa da string datetime. Pegando emprestado esta resposta , obtemos:
Você também pode querer ler esta postagem do blog .
fonte
Ao combinar todas as respostas acima, obtive a seguinte função:
fonte
Eu uso o pêndulo:
fonte
Ou, para obtê-lo de uma só vez:
fonte