@ Hasteur, sim. O segundo número representa o número de segundos que passaram entre o início da época do unix e a data especificada. Esse formato também é conhecido como horário POSIX.
eikonomega
Respostas:
316
>>>import time
>>>import datetime
>>> s ="01/12/2011">>> time.mktime(datetime.datetime.strptime(s,"%d/%m/%Y").timetuple())1322697600.0
assume a meia-noite 01/12/2011 no fuso horário local. Se a entrada estiver em UTC; você poderia usar calendar.timegm()ou.toordinal()
jfs
49
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()é um pouco menor
timdiels
11
@timdiels: novamente. .timestamp()assume a hora local em vez de UTC se nenhum fuso horário explícito for especificado. O código na resposta funciona (produz o esperado 1322697600) apenas em um computador em que o fuso horário local tem deslocamento de utc zero.
JFS
7
isso não funciona: datetime.datetime.strptime ("2014: 06: 28 11:53:21", "% Y:% m:% d% H:% M:% S"). timestamp () Traceback ( última chamada mais recente): Arquivo "<stdin>", linha 1, em <module> AttributeError: 'datetime.datetime' objeto não tem atributo 'timestamp'
Quando eu executar os exemplos neste post, eu recebo o erro: NameError: name 'wckCalendar' is not defined. Estou executando o Python 3.4.1 em uma máquina Windows de 32 bits. Qualquer ideia? Obrigado.
sedeh 14/08/14
1
@sedeh não há wckCalendar no post. Verifique seu código.
JFS
@JFSebastian Exatamente, e eu não estava tentando ligar diretamente para o wckCalendar. Apenas aparece na mensagem de erro. Veja meu post aqui discutindo o problema.
sedeh 14/08/14
1
@ törzsmókus: Se a resposta estiver errada, não importa o quão legível seja.
jfs
1
@ törzsmókus: veja minha resposta: ela pode produzir dois números diferentes. Sua resposta produz um número sem mencionar qual.
Legibilidade conta. Veja minha resposta com o dateutil para uma solução muito mais legível por humanos.
törzsmókus 18/09/17
21
A resposta depende também do fuso horário da data de entrada. Se a sua data é local, você pode usar mktime () como o katrielalex disse - só que não vejo por que ele usou o datetime em vez desta versão mais curta:
Mas observe que meu resultado é diferente do dele, pois provavelmente estou em uma TZ diferente (e o resultado é o carimbo de data / hora do UNIX sem fuso horário)
Agora, se a data de entrada já estiver no UTC, acredito que a solução certa seja:
Muitas dessas respostas não se preocupam em considerar que a data é ingênua para começar.
Para estar correto, você precisa tornar a data ingênua um fuso horário com data e hora primeiro
import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011','%d/%m/%Y')>>> datetime.datetime(2011,12,1,0,0)# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)>>> datetime.datetime(2011,12,1,0,0,
tzinfo=<DstTzInfo'America/Los_Angeles' PST-1 day,16:00:00 STD>)# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)>>> datetime.datetime(2011,12,1,8,0, tzinfo=<UTC>)# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)>>> datetime.datetime(1970,1,1,0,0, tzinfo=<UTC>)# get the total second difference
ts =(d - epoch).total_seconds()>>>1322726400.0
# Don't do this:
d = datetime.datetime(2011,12,1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))>>> datetime.datetime(2011,1,12,0,0,
tzinfo=<DstTzInfo'America/Los_Angeles' LMT-1 day,16:07:00 STD>)# tzinfo in not PST but LMT here, with a 7min offset !!!# when converting to UTC:
d = d.astimezone(pytz.UTC)>>> datetime.datetime(2011,1,12,7,53, tzinfo=<UTC>)# you end up with an offset
Está errado. O OP espera tempo no "%d/%m/%Y"formato. Compare: dateutil.parser.parse("01/02/2001")edatetime.strptime("01/02/2001", "%d/%m/%Y")
jfs
obrigado @jfs, boa captura. Eu atualizei minha resposta de acordo. (como um não-americano, eu não teria pensado o M ilógico / formato D / Y foi o padrão para o analisador.)
törzsmókus
1
ele não produz o esperado, a 1322697600menos que o fuso horário local seja UTC. Veja meu comentário de 2014
jfs
4
Parece ser bastante eficiente:
import datetime
day, month, year ='01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()
1,61 µs ± 120 ns por loop (média ± desvio padrão de 7 execuções, 100000 loops cada)
Qual é a datetimefunção? datetimeda datetimebiblioteca não oferece suporte.timestamp()
Joooeey 17/04/19
@Joooeey: Sim , no Python 3.3 ou posterior . Não estava disponível quando a pergunta foi publicado, mas está disponível desde setembro de 2012.
ShadowRanger
0
basta usar datetime.timestamp (sua instância de datetime), a instância datetime contém as informações do fuso horário; portanto, o timestamp será um timestamp utc padrão. se você transformar a data e hora em horário, ela perderá o fuso horário; portanto, o resultado será um erro. se você deseja fornecer uma interface, escreva assim: int (datetime.timestamp (time_instance)) * 1000
Você pode consultar este link a seguir para usar a strptimefunção from datetime.datetime, para converter a data de qualquer formato junto com o fuso horário.
my_date ='2020/08/08'
my_date = my_date.replace('/','-')# just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()
Respostas:
fonte
calendar.timegm()
ou.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()
é um pouco menor.timestamp()
assume a hora local em vez de UTC se nenhum fuso horário explícito for especificado. O código na resposta funciona (produz o esperado1322697600
) apenas em um computador em que o fuso horário local tem deslocamento de utc zero.Eu uso
ciso8601
, que é 62x mais rápido que o tempo de atividade do datetime.Você pode aprender mais aqui .
fonte
Para converter a string em um objeto de data:
A maneira de converter o objeto de data em carimbo de data / hora do POSIX depende do fuso horário. De conversão
datetime.date
para carimbo de data / hora UTC em Python :objeto data representa meia-noite no UTC
objeto data representa meia-noite no horário local
Os carimbos de data e hora são diferentes, a menos que meia-noite no UTC e na hora local sejam a mesma instância de hora.
fonte
NameError: name 'wckCalendar' is not defined
. Estou executando o Python 3.4.1 em uma máquina Windows de 32 bits. Qualquer ideia? Obrigado.fonte
"%s"
não é suportado pelo Python . Não é portátil.A resposta depende também do fuso horário da data de entrada. Se a sua data é local, você pode usar mktime () como o katrielalex disse - só que não vejo por que ele usou o datetime em vez desta versão mais curta:
Mas observe que meu resultado é diferente do dele, pois provavelmente estou em uma TZ diferente (e o resultado é o carimbo de data / hora do UNIX sem fuso horário)
Agora, se a data de entrada já estiver no UTC, acredito que a solução certa seja:
fonte
Basta usar
datetime.datetime.strptime
:Resultado:
Para usar o UTC em vez do fuso horário local, use
.replace
:fonte
float
nãoint
Primeiro você deve a classe strptime para converter a string em um formato struct_time.
Em seguida, basta usar o mktime de lá para pegar seu carro alegórico.
fonte
Muitas dessas respostas não se preocupam em considerar que a data é ingênua para começar.
Para estar correto, você precisa tornar a data ingênua um fuso horário com data e hora primeiro
Além disso:
Tenha cuidado, usando
pytz
fortzinfo
em umdatetime.datetime
NÃO FUNCIONA por muitos fusos horários. Veja data e hora com pytz fuso horário. Deslocamento diferente, dependendo de como o tzinfo está definidohttps://en.wikipedia.org/wiki/Local_mean_time
fonte
Eu sugeriria dateutil :
fonte
"%d/%m/%Y"
formato. Compare:dateutil.parser.parse("01/02/2001")
edatetime.strptime("01/02/2001", "%d/%m/%Y")
1322697600
menos que o fuso horário local seja UTC. Veja meu comentário de 2014Parece ser bastante eficiente:
1,61 µs ± 120 ns por loop (média ± desvio padrão de 7 execuções, 100000 loops cada)
fonte
datetime
função?datetime
dadatetime
biblioteca não oferece suporte.timestamp()
basta usar datetime.timestamp (sua instância de datetime), a instância datetime contém as informações do fuso horário; portanto, o timestamp será um timestamp utc padrão. se você transformar a data e hora em horário, ela perderá o fuso horário; portanto, o resultado será um erro. se você deseja fornecer uma interface, escreva assim: int (datetime.timestamp (time_instance)) * 1000
fonte
Você pode consultar este link a seguir para usar a
strptime
função fromdatetime.datetime
, para converter a data de qualquer formato junto com o fuso horário.https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
fonte
você pode converter para isoformato
fonte
Uma função simples para obter o tempo UNIX Epoch.
NOTA : Esta função supõe que a data e hora de entrada estejam no formato UTC (consulte os comentários aqui).
Uso :
fonte