Estou lidando com datas em Python e preciso convertê-las em carimbos de data e hora UTC para serem usados dentro de Javascript. O código a seguir não funciona:
>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)
Converter o objeto de data primeiro em datetime também não ajuda. Eu tentei o exemplo neste link de, mas:
from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)
e agora:
mktime(utc.localize(input_date).utctimetuple())
ou
mktime(timezone('US/Eastern').localize(input_date).utctimetuple())
funciona.
Pergunta tão geral: como posso converter uma data em segundos desde a época, de acordo com o UTC?
datetime.date
, o outro está tentando converter uma representação de string de um fuso horário para outro. Como alguém que procura uma solução para esse problema, posso não concluir que o último forneça a resposta que estou procurando.Respostas:
Se
d = date(2011, 1, 1)
estiver no UTC:Se
d
estiver no fuso horário local:timestamp1
etimestamp2
pode diferir se meia-noite no fuso horário local não for a mesma instância de hora que meia-noite no UTC.mktime()
pode retornar um resultado errado sed
corresponder a um horário local ambíguo (por exemplo, durante a transição do horário de verão) ou sed
for uma data passada (futura) em que o deslocamento utc possa ter sido diferente e o Cmktime()
não tenha acesso ao banco de dados tz na plataforma fornecida . Você pode usar opytz
módulo (por exemplo, viatzlocal.get_localzone()
) para obter acesso ao banco de dados tz em todas as plataformas . Além disso,utcfromtimestamp()
pode falhar emktime()
pode retornar o carimbo de data / hora não POSIX se o"right"
fuso horário for usado .Para converter um
datetime.date
objeto que representa a data no UTC semcalendar.timegm()
:Como posso converter uma data em segundos desde a época, de acordo com o UTC?
Converter
datetime.datetime
(nãodatetime.date
) o objeto que já representa a hora no UTC no carimbo de data / hora POSIX correspondente (afloat
).Python 3.3 ou superior
datetime.timestamp()
:Nota: É necessário fornecer
timezone.utc
explicitamente, caso contrário,.timestamp()
suponha que seu objeto de data e hora ingênuo esteja no fuso horário local.Python 3 (<3.3)
Dos documentos para
datetime.utcfromtimestamp()
:Leitura interessante: época da época versus hora do dia sobre a diferença entre Que horas são? e Quantos segundos se passaram?
Consulte também: datetime precisa de um método de "época"
Python 2
Para adaptar o código acima para Python 2:
Onde
timedelta.total_seconds()
é equivalente ao(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
calculado com a divisão verdadeira ativada.Exemplo
Cuidado com com problemas de ponto flutuante .
Resultado
Como converter um
datetime
objeto consciente em carimbo de data / hora POSIXNo Python 3:
No Python 2:
fonte
timestamp = (dt - datetime.fromtimestamp(0)).total_seconds()
:?datetime(1970, 1, 1)
é mais explícito.fromtimestamp()
está incorreto aqui (dt
está no UTC, portanto,utcfromtimestamp()
deve ser usado).totimestamp()
função na resposta.Apenas para sistemas unix :
Nota 1: dizzyf observou que isso se aplica a fusos horários localizados . Não use na produção.
Nota 2: Jakub Narębski observou que isso ignora informações de fuso horário, mesmo para data e hora com reconhecimento de offset (testado para Python 2.7).
fonte
man strftime
sistemas semelhantes ao Unix.Suposição 1: você está tentando converter uma data em um carimbo de data / hora. No entanto, como uma data cobre um período de 24 horas, não há um único carimbo de data e hora que represente essa data. Suponho que você queira representar o carimbo de data e hora dessa data à meia-noite (00: 00: 00.000).
Suposição 2: a data que você apresenta não está associada a um fuso horário específico, no entanto, você deseja determinar o deslocamento de um fuso horário específico (UTC). Sem saber o fuso horário da data, não é possível calcular um carimbo de data / hora para um fuso horário específico. Suponho que você deseja tratar a data como se estivesse no fuso horário do sistema local.
Primeiro, você pode converter a instância de data em uma tupla representando os vários componentes de hora usando o
timetuple()
membro:Você pode converter isso em um carimbo de data / hora usando
time.mktime
:Você pode verificar esse método testando-o com o próprio horário da época (01-01-2009); nesse caso, a função deve retornar o deslocamento do fuso horário para o fuso horário local nessa data:
28800.0
são 8 horas, o que seria correto para o fuso horário do Pacífico (onde estou).fonte
siga o documento python2.7, você precisará usar calendar.timegm () em vez de time.mktime ()
fonte
d
estiver no UTC?Eu defini minhas próprias duas funções
aqui:
fonte
a pergunta está um pouco confusa. os carimbos de data e hora não são UTC - são uma coisa do Unix. a data pode ser UTC? assumindo que é, e se você estiver usando o Python 3.2+, simple-date torna isso trivial:
se você realmente tem o ano, mês e dia, não precisa criar o
date
:e se a data estiver em outro fuso horário (isso é importante porque estamos assumindo a meia-noite sem um horário associado):
[a idéia por trás do simple-date é coletar todas as informações de data e hora do python em uma classe consistente, para que você possa fazer qualquer conversão. então, por exemplo, também irá para o outro lado:
]
fonte
SimpleDate(date(2011,1,1), tz='America/New_York')
aumentaNoTimezone
, enquantopytz.timezone('America/New_York')
não gera nenhuma exceção (simple-date==0.4.8
,pytz==2014.7
).pip install simple-date
, parece que é apenas python3 / pip3.Usando o pacote arrow :
fonte
arrow
usadateutil
edateutil
conhece há muitos anos bugs relacionados ao manuseio de fuso horário. Não use-o se precisar de resultados corretos para fusos horários com um deslocamento UTC não fixo (não há problema em usá-lo no fuso horário UTC, mas o stdlib também lida com o caso UTC).Uma sequência de tempo completa contém:
[+HHMM or -HHMM]
Por exemplo:
1970-01-01 06:00:00 +0500
==1970-01-01 01:00:00 +0000
==UNIX timestamp:3600
Nota:
Editar:
fonte
1970-01-01 06:00:00 +0500
para3600
como você pediu.timezone
nopython2
, você pode fazer o cálculo (06:00:00
-+0500
=01:00:00
) manualmente.Considerando que você tem um
datetime
objeto chamadod
, use o seguinte para obter o registro de data e hora no UTC:E na direção oposta, use o seguinte:
fonte
Estou impressionado com a profunda discussão.
meus 2 centavos:
da data e hora da importação data e hora da importação
o registro de data e hora em utc é:
ou,
se agora resultar de datetime.now (), no mesmo horário de verão
fonte