O time.time () do Python retorna o carimbo de data / hora local ou UTC?

561

Será que time.time()no módulo de tempo Python retornar hora do sistema ou a hora em UTC?

Saransh Mohapatra
fonte
87
Os carimbos de data e hora não têm fuso horário. Eles representam um número de segundos desde a época. A época é um momento específico no tempo que não depende do fuso horário.
GTC
2
@jwg: os carimbos de data / hora POSIX comumente usados ​​não contam segundos bissextos e, portanto, não são o "número de [SI decorridos] desde a época" (eles estão próximos).
jfs
7
Eu não acho que essa seja uma objeção precisa @JFSebastian. Os segundos bissextos não são 'segundos decorridos desde a época'. São alterações nas representações de tempo registradas pelos relógios que não correspondem aos segundos decorridos.
GTC
4
@JFSebastian Desculpe pela confusão. Os segundos bissextos não são 'segundos decorridos'. Portanto, os carimbos de data e hora, que são 'números de segundos decorridos', não incluem e não devem incluir segundos bissextos.
GTC
2
@jwg errado. Você não pode apagar o tempo físico. O registro de data e hora do POSIX não é o número de segundos SI passados. Aqui está um exemplo: transcorreram 3 segundos entre "31 de dezembro de 2016 às 18:59:59" e "31 de dezembro de 2016 às 19:00:01" em Nova York, mas a diferença nos carimbos de data / hora POSIX correspondentes é de apenas 2 segundos (o pulo segundo não é contado).
jfs

Respostas:

780

A time.time()função retorna o número de segundos desde a época, como segundos. Observe que a "época" é definida como o início de 1º de janeiro de 1970 no UTC. Portanto, a época é definida em termos de UTC e estabelece um momento global no tempo. Não importa onde você esteja "segundos após a época" (time.time ()) retornará o mesmo valor no mesmo momento.

Aqui está um exemplo de saída que corri no meu computador, convertendo-a em uma string também.

Python 2.7.3 (default, Apr 24 2012, 00:00:54) 
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>

A tsvariável é o tempo retornado em segundos. Em seguida, converti-o em uma string usando a datetimebiblioteca, tornando-a legível por humanos.

esquizofrênico
fonte
72
Por que deveríamos, import timequando datetime, basicamente fornece um carimbo de data / hora. Basta remover os milissegundos -str(datetime.datetime.now()).split('.')[0]
Hussain
17
A época do @Alexis Unix é definida claramente aqui . Ele ainda aponta um exemplo de Python de maneira mais detalhada na página. Eu não entendo o seu comentário.
squiguy
9
@ esquiguy para ser honesto, não me lembro o que me fez dizer isso. Eu devo ter interpretado mal alguma coisa e estava lutando para descobrir por que alguns testes estavam sendo interrompidos enquanto eu me mudava entre a França e os EUA para finalmente descobrir que o problema era por causa do horário de verão que torna a semana mais longa nesse período do ano. Desculpe por isso e obrigado por apontar isso.
Alexis1 #
5
não são "segundos no UTC". . O registro de data e hora retornado por time.time()não está em nenhum fuso horário . "segundos desde a época" é um termo; não são decorridos segundos desde algum momento (época). Você pode convertê- lo para a hora local (com o banco de dados tz) e / ou o fuso horário UTC facilmente. Aliás, se você soltar .strftime()o resultado é (quase) o mesmo (+/- microssegundos).
jfs
3
apenas testei, time.time () não indica a hora UTC, mas a hora local
sliders_alpha 8/17
302

É para o formato de texto de um carimbo de data / hora que pode ser usado em seus arquivos de texto. (O título da pergunta era diferente no passado, então a introdução a esta resposta foi alterada para esclarecer como ela poderia ser interpretada como a hora. [Atualizado 2016-01-14])

Você pode obter o registro de data e hora como uma string usando o .now()ou .utcnow()de datetime.datetime:

>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000

O nowdifere do utcnowesperado, caso contrário, eles funcionam da mesma maneira:

>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000

Você pode renderizar o carimbo de data e hora na cadeia explicitamente:

>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'

Ou você pode ser ainda mais explícito para formatar o timestamp da maneira que desejar:

>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'

Se você deseja o formato ISO, use o .isoformat()método do objeto:

>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'

Você pode usá-los em variáveis ​​para cálculos e impressão sem conversões.

>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980
pepr
fonte
1
Eu queria que o tempo da época ... não estivesse no formato de data ... como ficou evidente na minha menção ao comando time.time ()
Saransh Mohapatra
34
OK, sem problemas. Outra pessoa pode precisar de um carimbo de data / hora para colocar em arquivos de texto.
PEPR
1
Eu sou outro, redirecionado aqui provavelmente devido ao número razoável de votos. A pergunta está incorreta e a resposta aceita é enganosa para a necessidade típica: obter um sufixo legível por humanos - digamos, para nomes de arquivos - no fuso horário do servidor mais usado.
Para imprimir um registro de data e hora como parte de uma seqüência de caracteres, use o seguinte: Python2: import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE
datetime.datetime.utcnow()é mau. Ele cria um horário de data ingênuo que não é hora local. A menos que a hora local seja UTC, será ERRADO. Use em datetime.datetime.now(datetime.timezone.utc)vez disso. Isso cria um datetime com reconhecimento de fuso horário que representa o horário atual.
Terrel Shumway
139

Com base na resposta de #squiguy, para obter um carimbo de data / hora verdadeiro, digite-o como cast.

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318

Pelo menos esse é o conceito.

Rudi Strydom
fonte
1
Qual é o motivo da digitação do carimbo de data e hora? Qual é o tipo por padrão?
Tizzee
3
@Tizzee type(time.time())gives<type 'float'>
famousgarkin
4
Mas se você precisar de um tempo mais preciso do que em segundos, o flutuador fará sentido.
pepr 5/02/2014
3
@RudiStrydom: Python é fortemente tipado. Não confunda com a digitação estática.
JFS
1
@CheokYanCheng: int()é polimórfico. Ele retornaria, longse necessário, nas versões antigas do Python - todos os números inteiros são longos nas novas versões do Python.
JFS
30

A resposta pode ser nenhuma ou ambas.

  • nenhum: time.time()retorna aproximadamente o número de segundos decorridos desde a época. O resultado não depende do fuso horário, portanto, não é UTC nem hora local. Aqui está a definição POSIX para "Segundos desde a época" .

  • ambos: time.time()não requer que o relógio do sistema seja sincronizado para refletir seu valor (embora não tenha nada a ver com o fuso horário local). Computadores diferentes podem obter resultados diferentes ao mesmo tempo. Por outro lado, se a hora do seu computador estiver sincronizada, é fácil obter a hora UTC do registro de data e hora (se ignorarmos os segundos bissextos):

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)

Sobre como obter registros de data e hora da hora UTC em várias versões do Python, consulte Como posso obter uma data convertida em segundos desde a época, de acordo com a UTC?

jfs
fonte
4
Esta é a única resposta que é mencionada corretamente, datetime.utcfromtimestampenquanto há 308 upvotes em uma resposta com datetime.fromtimestamp:-(
@TerrelShumway, a pergunta é sobre o que a time.time()função retorna (é muito curta). Seu comentário aborda outra questão (você o mudou desde que comecei a respondê-lo. Para pior). Uma nota à parte; a palavra "correto" deve ser usada com moderação (os fusos horários são complicados - não há uma bala de prata - apenas trocas por um caso de uso específico).
JFS
Não use datetime.datetime.utcfromtimestamp(ts). A menos que o horário local seja UTC, será ERRADO, pois cria um horário de data ingênuo que não é horário local. Use em datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)vez disso. Isso cria um datetime com reconhecimento de fuso horário, representando o mesmo instante que o registro de data e hora.
Terrel Shumway
Sim. Meu comentário anterior estava completamente errado. A maior parte do código no módulo datetime trata as datas ingênuas como hora local. Usar datetime ingênuo é como abrir um arquivo de texto sem saber a codificação.
Terrel Shumway
@TerrelShumway É errado supor que a hora UTC possa ser usada apenas em sistemas onde é a hora local. É verdade que algumas partes do stdlib tratam objetos de data / hora ingênuos como tendo o fuso horário local (infelizmente). Eu preferiria que naive_dt.astimezone()não existisse, já que o implícito bytes.encode()não existe mais no Python 3. É verdade que é benéfico trabalhar internamente com o horário UTC em muitos casos. Muitas coisas podem ser ditas sobre o módulo data / hora (eu respondi perguntas suficientes para obter um distintivo dourado), a maioria está fora do escopo da pergunta: o que time.time()retorna.
JFS
4

Acabei me contentando com:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
Natim
fonte
1
Isso pode satisfazer suas necessidades locais, mas pode ser enganoso para as pessoas que esperam que os números nesse intervalo sejam segundos desde a época [GMT]. time.time()retorna decimal / float 1574115250.818733e milissegundos desde a época é fácil, int(time.time() * 1000)por exemplo, #1574115254915
MarkHu 18/11/19
3

Não existe uma "época" em um fuso horário específico. A época é bem definida como um momento específico no tempo; portanto, se você alterar o fuso horário, o próprio tempo também mudará. Especificamente, desta vez é Jan 1 1970 00:00:00 UTC. Então, time.time()retorna o número de segundos desde a época.

HyperNeutrino
fonte
Embora seja verdade que o UTC é um padrão de horário e não um fuso horário, o padrão é que ele compartilhe o mesmo horário que o GMT. Então ....
Craig Hicks
3

o registro de data e hora é sempre o horário em utc, mas quando você o chama datetime.datetime.fromtimestamp , retorna o horário no fuso horário local correspondente a esse registro de data e hora; portanto, o resultado depende do local.

>>> import time, datetime

>>> time.time()
1564494136.0434234

>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)

Existe uma boa biblioteca arrowcom comportamento diferente. No mesmo caso, ele retorna o objeto de tempo com o fuso horário UTC.

>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>
Ryabchenko Alexander
fonte