Eu tenho uma instância de data e hora python que foi criada usando datetime.utcnow () e persistiu no banco de dados.
Para exibição, eu gostaria de converter a instância datetime recuperada do banco de dados em datetime local usando o fuso horário local padrão (ou seja, como se o datetime fosse criado usando datetime.now ()).
Como converter o horário e hora UTC em um horário local usando apenas a biblioteca padrão python (por exemplo, nenhuma dependência pytz)?
Parece que uma solução seria usar datetime.astimezone (tz), mas como você obteria o fuso horário local padrão?
python
datetime
timezone
python-datetime
Nitro Zark
fonte
fonte
Respostas:
No Python 3.3 ou superior:
No Python 2/3:
Usando
pytz
(ambos Python 2/3):Exemplo
Resultado
Python 3.3 Python 2 pytzNota: leva em consideração o horário de verão e a alteração recente do deslocamento utc para o fuso horário do MSK.
Não sei se as soluções não-pytz funcionam no Windows.
fonte
.normalize()
porque o fuso horário de origem.astimezone()
é UTC.TypeError: replace() takes no keyword arguments
ao tentar a solução pytz.local_dt.replace(tzinfo=None).astimezone(tz=timezone.utc)
Você não pode fazer isso apenas com a biblioteca padrão, pois a biblioteca padrão não possui fusos horários. Você precisa de pytz ou dateutil .
Ou então, você pode fazer isso sem pytz ou dateutil implementando seus próprios fusos horários. Mas isso seria bobagem.
fonte
Você não pode fazer isso com a biblioteca padrão. Usando o módulo pytz , você pode converter qualquer objeto de data / hora ingênuo / consciente para qualquer outro fuso horário. Vamos ver alguns exemplos usando o Python 3.
Para converter um objeto ingênuo em qualquer outro fuso horário, primeiro você deve convertê-lo em um objeto de data e hora consciente . Você pode usar o
replace
método para converter um ingênuo objeto de data e hora em um objeto de data e hora consciente . Em seguida, para converter um objeto datetime com reconhecimento para qualquer outro fuso horário, você pode usar oastimezone
métodoA variável
pytz.all_timezones
fornece a lista de todos os fusos horários disponíveis no módulo pytz.Como o
now
método retorna a data e a hora atuais, é necessário conscientizar primeiro o fuso horário do objeto datetime. Alocalize
função converte um objeto datetime ingênuo em um objeto datetime com reconhecimento de fuso horário. Em seguida, você pode usar oastimezone
método para convertê-lo em outro fuso horário.fonte
Acho que descobri: calcula o número de segundos desde a época, depois converte para uma timzeone local usando time.localtime e depois converte a estrutura de tempo novamente em um datetime ...
Aplica o horário de verão / inverno corretamente:
fonte
utctotimestamp(utc_dt) -> (seconds, microseconds)
do seu código para maior clareza, consulte Implementação em Python 2.6-3.xCom base no comentário de Alexei. Isso deve funcionar para o horário de verão também.
fonte
A biblioteca padrão do Python não vem com nenhuma
tzinfo
implementação. Sempre considerei isso uma falha surpreendente do módulo datetime.A documentação para a classe tzinfo vem com alguns exemplos úteis. Procure o bloco de código grande no final da seção.
fonte
os
módulo poderia ter fornecido um horário local com base nas funções do sistema operacional.O Python 3.9 adiciona o
zoneinfo
módulo , agora ele pode ser feito da seguinte maneira (apenas stdlib):A Europa Central está 1 ou 2 horas à frente do UTC, assim
local_aware
é:como
str
:O Windows não possui um banco de dados de fuso horário do sistema; portanto, aqui é necessário um pacote extra:
Há um backport para permitir o uso no Python 3.6 a 3.8 :
Então:
fonte
zoneinfo
aqui - veja a primeira parte da resposta do jfs (parte do Python3.3 +) ;-)ZoneInfo('localtime')
é muito mais claro do quetz=None
(afinal, pode-se esperartz=None
remover o fuso horário ou retornar o UTC em vez da hora local).Uma maneira simples (mas talvez falha) que funciona no Python 2 e 3:
Sua vantagem é que é trivial escrever uma função inversa
fonte
time.timezone
não leva em consideração o horário de verão.A maneira mais fácil que encontrei é calcular o horário de onde você está e subtraí-lo da hora.
Isso funciona para mim, no Python 3.5.2.
fonte
Aqui está outra maneira de alterar o fuso horário no formato datetime (eu sei que desperdicei minha energia nisso, mas não vi esta página, então não sei como) sem min. e seg. porque eu não preciso dele para o meu projeto:
fonte
Essa é uma maneira terrível de fazer isso, mas evita a criação de uma definição. Ele cumpre o requisito de ficar com a biblioteca básica do Python3.
fonte
Use timedelta para alternar entre fusos horários. Tudo o que você precisa é o deslocamento em horas entre os fusos horários. Não é necessário mexer nos limites dos 6 elementos de um objeto de data e hora. A timedelta lida com anos bissextos, séculos bissextos, etc., também com facilidade. Você deve primeiro
Então, se
offset
é o delta do fuso horário em horas:timeout = timein + timedelta(hours = offset)
onde timein e timeout são objetos de data e hora. por exemplo
timein + timedelta(hours = -8)
converte de GMT para PST.
Então, como determinar
offset
? Aqui está uma função simples, desde que você tenha apenas algumas possibilidades de conversão sem usar objetos de data e hora que estejam "cientes" do fuso horário, o que algumas outras respostas agradam. Um pouco manual, mas às vezes a melhor clareza.Depois de examinar as numerosas respostas e brincar com o código mais rígido que consigo pensar (por enquanto), parece melhor que todos os aplicativos, nos quais o tempo é importante e os fusos horários mistos devam ser considerados, façam um esforço real para criar todos os objetos de data e hora "consciente". Parece que a resposta mais simples é:
para converter para GMT, por exemplo. Obviamente, para converter para / de qualquer outro fuso horário que você desejar, local ou não, basta usar a string de fuso horário apropriada que o pytz entende (de pytz.all_timezones). O horário de verão também é levado em consideração.
fonte