Como converter uma sequência de data e hora no horário local em uma sequência no horário UTC ?
Tenho certeza de que já fiz isso antes, mas não consigo encontrá-lo, e espero que SO me ajude (e outros) a fazer isso no futuro.
Esclarecimento : Por exemplo, se eu tenho 2008-09-17 14:02:00
em meu fuso horário local ( +10
), eu gostaria de gerar uma seqüência com o equivalente UTC
tempo: 2008-09-17 04:02:00
.
Além disso, em http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ , observe que, em geral, isso não é possível, pois no horário de verão e em outros problemas, não há conversão única da hora local para Hora UTC.
Respostas:
Primeiro, analise a sequência em um objeto de data e hora ingênuo. Esta é uma instância
datetime.datetime
sem informações de fuso horário anexadas. Consulte a documentação paradatetime.strptime
obter informações sobre a análise da sequência de datas.Use o
pytz
módulo, que vem com uma lista completa de fusos horários + UTC. Descobrir qual é o fuso horário local, construir um objeto de fuso horário a partir dele, manipular e anexá-lo à data e hora ingênuas.Por fim, use o
datetime.astimezone()
método para converter a data e hora em UTC.Código-fonte, usando o fuso horário local "America / Los_Angeles", para a sequência "2001-2-3 10:11:12":
A partir daí, você pode usar o
strftime()
método para formatar a data e hora UTC, conforme necessário:fonte
tzlocal.get_localzone()
para obter o fuso horário local comopytz
tzinfo objetoA função utcnow () do módulo datetime pode ser usada para obter a hora UTC atual.
Como o link mencionado acima por Tom: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ diz:
NOTA - Se algum dos seus dados estiver em uma região que usa horário de verão, use
pytz
e dê uma olhada na resposta de John Millikin.Se você deseja obter o horário UTC de uma determinada sequência e tiver a sorte de estar em uma região do mundo que não usa o horário de verão, ou se você tiver dados que são apenas deslocados do UTC sem o horário de verão aplicado:
-> usando a hora local como base para o valor de compensação:
-> Ou, de um deslocamento conhecido, usando datetime.timedelta ():
ATUALIZAR:
Desde python 3.2
datetime.timezone
está disponível. Você pode gerar um objeto datetime com reconhecimento de fuso horário com o comando abaixo:Se você está pronto para assumir conversões de fuso horário, leia o seguinte:
https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7
fonte
tzinfo.utcoffset() must return a whole number of minutes
e assim por diante.Obrigado @rofly, a conversão completa de string para string é a seguinte:
Meu resumo das funções
time
/calendar
:time.strptime
string -> tupla (nenhum fuso horário aplicado, portanto, corresponde à string)
time.mktime
tupla da hora local -> segundos desde a época (sempre hora local)
time.gmtime
segundos desde a época -> tupla no UTC
e
calendar.timegm
tupla em UTC -> segundos desde a época
time.localtime
segundos desde a época -> tupla no fuso horário local
fonte
(always local time)
parece estar errado: a entrada para mktime () é hora local, a saída é segundos desde a época (1970-01-01 00:00:00 +0000 (UTC)
) que não depende do fuso horário.Aqui está um resumo das conversões de tempo comuns do Python.
Alguns métodos eliminam frações de segundos e são marcados com (s) . Uma fórmula explícita como
ts = (d - epoch) / unit
pode ser usada (obrigado jfs).calendar.timegm(struct_time)
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
(exceção durante transições de horário de verão, ver comentário de jfs)
calendar.timegm(dt.utctimetuple())
calendar.timegm(dt.utctimetuple())
time.gmtime(t)
(ver comentário de jfs)
stz.localize(dt, is_dst=None).utctimetuple()
(exceção durante transições de horário de verão, veja o comentário de jfs)
dt.utctimetuple()
dt.utctimetuple()
datetime.fromtimestamp(t, None)
(pode falhar em determinadas condições, veja o comentário de jfs abaixo)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
não pode representar segundos bissextos, veja o comentário de jfs)
dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
dt.astimezone(tz).replace(tzinfo=None)
datetime.utcfromtimestamp(t)
datetime.datetime(*struct_time[:6])
(não pode representar segundos bissextos, veja o comentário de jfs)
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
(exceção durante transições de horário de verão, veja o comentário de jfs)
dt.astimezone(UTC).replace(tzinfo=None)
datetime.fromtimestamp(t, tz)
(pode falhar para fusos horários não pytz)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
(não pode representar segundos bissextos, veja o comentário de jfs)
stz.localize(dt, is_dst=None)
(exceção durante transições de horário de verão, consulte o comentário de jfs)
dt.replace(tzinfo=UTC)
Fonte: taaviburns.ca
fonte
fromtimestamp(t, None)
pode falhar se o fuso horário local tiver um deslocamento utc diferente emt
e a biblioteca C não tiver acesso ao banco de dados tz na plataforma especificada. Você pode usartzlocal.get_localzone()
para fornecer tzdata de maneira portátil. (2)fromtimestamp(t, tz)
pode falhar em fusos horários que não sejam pytz. (3)datetime(*struct_time[:6])
você está desaparecido*
. (4)timegm()
,utctimetuple()
,struct_time
soluções baseadas gota fracções de segundo. Você pode usar uma fórmula explícita, como: emts = (d - epoch) / unit
vez disso.stz.localize(dt, is_dst=None)
gera uma exceção para horários locais ambíguos ou inexistentes, por exemplo, durante transições de horário de verão. Para evitar a exceção, use umstz.normalize(stz.localize(dt))
que possa retornar resultados imprecisos. (6) datetime () não pode representar um salto de segundo. Convertastruct_time
para "segundos desde a época" como uma solução alternativa primeiro. (7)time.gmtime(t)
ao contrário,calendar.timegm()
pode esperar uma entrada não POSIX se o fuso horário "correto" for usado. Use a fórmula explícita se a entrada for POSIX:gmtime = lambda t: datetime(1970,1,1, tzinfo=utc) + timedelta(seconds=t)
<table>
tags. Desculpe. Isso é intencional e por design. Se você precisar de uma" tabela "rápida e suja, use um<pre>
layout ASCII". Não acredito que uma tabela ASCII seja mais legível que a lista acima.Fonte: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html
Exemplo de uso do bd808 : Se sua fonte for um
datetime.datetime
objetot
, chame como:fonte
t
, chamada como: local_to_utc (t.timetuple ()).timetuple()
conjuntos de chamadastm_isdst
para-1
; há 50% de chance demktime()
falha durante a transição do horário de verão.Estou tendo boa sorte com o dateutil (que é amplamente recomendado no SO para outras questões relacionadas):
(O código foi derivado desta resposta para Converter a string de data e hora UTC em data e hora local )
fonte
dateutil
pode falhar em datas passadas se o fuso horário local tiver um deslocamento utc diferente então (não relacionado às transições de horário de verão) em sistemas nos quais a implementação não usa um banco de dados histórico de fuso horário (principalmente o Windows).pytz
+tzlocal
poderia ser usado em seu lugar.Mais um exemplo com pytz, mas inclui localize (), que salvou meu dia.
fonte
Eu tive o maior sucesso com python-dateutil :
fonte
dateutil
pode falhar para datas passadasfonte
mktime(dt.timetuple())
pode falhar durante a transição do horário de verão . HáLocalTimezone
nos docs (ele trabalha para a definição mais recente fuso horário, mas pode falhar por datas passadas (sem relação com DST))se você preferir datetime.datetime:
fonte
mktime()
espera a hora local como a entrada.fromtimestamp()
retorna a hora local, não utc. Se você corrigi-lo, em seguida, ver esses problemas adicionais (comodateutil
, solução apenas de stdlib pode falhar)Simples
Eu fiz assim:
Implementação chique
Se você quer ser extravagante, pode transformar isso em um functor:
Resultado:
fonte
Você pode fazer isso com:
fonte
E se -
se segundos são
None
, ele converte a hora local em UTC. Caso contrário, converte a hora passada em UTC.fonte
Para se locomover no horário de verão, etc.
Nenhuma das respostas acima me ajudou particularmente. O código abaixo funciona para GMT.
fonte
Usando http://crsmithdev.com/arrow/
Esta biblioteca facilita a vida :)
fonte
Encontrei a melhor resposta em outra pergunta aqui . Ele usa apenas bibliotecas internas python e não exige que você insira seu fuso horário local (um requisito no meu caso)
Estou reposicionando a resposta aqui, pois essa pergunta aparece no google em vez da pergunta vinculada, dependendo das palavras-chave da pesquisa.
fonte
Eu tenho esse código em um dos meus projetos:
fonte
Em python3:
pip install python-dateutil
fonte
from dateutil import tz
E se -
se segundos são
None
, ele converte a hora local em UTC. Caso contrário, converte a hora passada em UTC.fonte