Eu nunca tive que converter tempo de e para o UTC. Recentemente, solicitei que meu aplicativo soubesse do fuso horário, e eu tenho me executado em círculos. Muitas informações sobre a conversão da hora local em UTC, que eu achei bastante elementar (talvez eu esteja fazendo isso errado também), mas não consigo encontrar nenhuma informação sobre como converter facilmente a hora UTC no fuso horário dos usuários finais.
Em poucas palavras, e o aplicativo Android me envia dados (aplicativo de mecanismo) e dentro desses dados há um carimbo de data / hora. Para armazenar esse timestamp no utc time, estou usando:
datetime.utcfromtimestamp(timestamp)
Isso parece estar funcionando. Quando meu aplicativo armazena os dados, ele está sendo armazenado com 5 horas de antecedência (estou EST -5)
Os dados estão sendo armazenados na BigTable do aplicativo e, quando recuperados, saem como uma string assim:
"2011-01-21 02:37:21"
Como faço para converter essa string em um DateTime no fuso horário do usuário?
Além disso, qual é o armazenamento recomendado para as informações de fuso horário dos usuários? (Como você normalmente armazena informações tz, ou seja: "-5: 00" ou "EST" etc etc?) Tenho certeza de que a resposta à minha primeira pergunta pode conter um parâmetro que as respostas da segunda.
Respostas:
Se você não deseja fornecer seus próprios
tzinfo
objetos, consulte a biblioteca python-dateutil . Ele fornecetzinfo
implementações sobre um banco de dados zoneinfo (Olson) , para que você possa consultar as regras de fuso horário por um nome um tanto canônico.Editar exemplo expandido para mostrar o
strptime
usoEditar 2 Uso fixo da API para mostrar um melhor método de ponto de entrada
Editar 3 Métodos de detecção automática incluídos para fusos horários (Yarin)
fonte
dateutil.tz
e usartz.tzutc()
etz.tzlocal()
como objetos de fuso horário que estava procurando. Parece que o banco de dados de fuso horário no meu sistema está bom (fiz o check-in/usr/share/zoneinfo
). Não tenho certeza do que estava acontecendo.tz
módulo é o ponto de entrada correto a ser usado para esta biblioteca. Atualizei minha resposta para refletir isso. Odateutil.zoneinfo
módulo que eu estava mostrando anteriormente é usado internamente pelotz
módulo como um retorno, se não conseguir localizar o zoneinfo DB do sistema. Se você olhar dentro da biblioteca, verá que há um tarball zoneinfo DB no pacote que ele usa se não conseguir encontrar o DB do sistema. Meu velho exemplo estava tentando bater esse DB diretamente e eu estou supondo que você estava tendo problemas de carregamento que DB privada (não está no caminho python de alguma forma?)dateutil
, use em seupytz
lugar .Aqui está um método resiliente que não depende de nenhuma biblioteca externa:
Isso evita os problemas de tempo no exemplo de DelboyJay. E as questões de menor tempo na emenda de Erik van Oosten.
Como uma nota de rodapé interessante, o deslocamento do fuso horário calculado acima pode diferir da seguinte expressão aparentemente equivalente, provavelmente devido a alterações nas regras de horário de verão:
Atualização: este trecho tem a fraqueza de usar o deslocamento UTC da hora atual, que pode diferir do deslocamento UTC da data e hora de entrada. Veja os comentários nesta resposta para outra solução.
Para contornar os diferentes momentos, agarre o tempo da época do tempo passado. Aqui está o que eu faço:
fonte
pytz
db-like é impossível, consulte PEP-431. Embora você possa escrever uma solução stdlib-only que funcione nesses casos em sistemas que já possuem fuso horário histórico db, por exemplo, Linux, OS X, veja minha resposta .utc_datetime
momento.Consulte a documentação de data e hora em objetos tzinfo . Você precisa implementar os fusos horários que deseja se sustentar. Existem exemplos na parte inferior da documentação.
Aqui está um exemplo simples:
Resultado
fonte
replace
para definir o fuso horário como GMT e torná-lo "consciente", depois useastimezone
para converter para outro fuso horário.Se você deseja obter o resultado correto mesmo para o horário que corresponde a um horário local ambíguo (por exemplo, durante uma transição de horário de verão) e / ou o deslocamento local do utc é diferente em horários diferentes no seu fuso horário local, use
pytz
fusos horários:fonte
Esta resposta deve ser útil se você não quiser usar outros módulos além disso
datetime
.datetime.utcfromtimestamp(timestamp)
retorna umdatetime
objeto ingênuo (não consciente). Os conscientes têm consciência do fuso horário e os ingênuos não. Você quer um conhecimento se quiser converter entre fusos horários (por exemplo, entre o UTC e o horário local).Se você não instancia a data para começar, mas ainda pode criar um
datetime
objeto ingênuo no horário UTC, tente este código Python 3.x para convertê-lo:Cuidado para não assumir por engano que, se o fuso horário estiver no MDT, o horário de verão não funcionará com o código acima, pois ele imprime o MST. Você notará que, se alterar o mês para agosto, o MDT será impresso.
Outra maneira fácil de obter um
datetime
objeto consciente (também no Python 3.x) é criá-lo com um fuso horário especificado para começar. Aqui está um exemplo, usando o UTC:Se você usa o Python 2.x, provavelmente precisará subclassificar
datetime.tzinfo
e usá-lo para ajudá-lo a criar umdatetime
objeto consciente , uma vezdatetime.timezone
que não existe no Python 2.x.fonte
Se você estiver usando o Django, você pode usar o
timezone.localtime
método:fonte
Você pode usar a seta
você pode alimentar
arrow.get()
com qualquer coisa. timestamp, iso string etcfonte
Tradicionalmente, adio isso para o front-end - envio os horários do back-end como carimbos de data / hora ou algum outro formato de data e hora no UTC, em seguida deixo o cliente descobrir o deslocamento do fuso horário e renderizar esses dados no fuso horário apropriado.
Para um aplicativo da web, isso é muito fácil de fazer em javascript - você pode descobrir o deslocamento do fuso horário do navegador com bastante facilidade usando métodos internos e depois renderizar os dados do back-end corretamente.
fonte
Você pode usar
calendar.timegm
para converter seu tempo em segundos desde a época do Unix etime.localtime
converter novamente:Dá
Fri Jan 21 05:37:21 2011
(porque estou no UTC + 03: 00).fonte
por exemplo, meu fuso horário é ' +08: 00 '. input utc = 2018-10-17T00: 00: 00.111Z , então receberei saída = 2018-10-17T08: 00: 00 + 08: 00
fonte
A partir da resposta aqui , você pode usar o módulo de hora para converter de utc para a hora local definida no seu computador:
fonte
Aqui está uma versão rápida e suja que usa as configurações do sistema local para calcular a diferença horária. NOTA: Isso não funcionará se você precisar converter para um fuso horário no qual seu sistema atual não está sendo executado. Testei isso com as configurações do Reino Unido no fuso horário do BST
fonte
datetime.fromtimestamp(ts)
: posix timestamp (float segundos) -> objeto datetime no horário local (funciona bem se o SO se lembrar de deslocamentos utc passados para o fuso horário local, ou seja, no Unix, mas não no Windows para datas anteriores)). Caso contrário, o pytz poderia ser usado.offset = datetime.utcnow().replace(minute=0, second=0, microsecond=0) - datetime.now().replace(minute=0, second=0, microsecond=0)
Eu obtive diferenças estranhas de microssegundos sem ele.datetime.fromtimestamp(ts)
a resposta?Consolidar a resposta dos franksands em um método conveniente.
fonte