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?


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.


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

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.


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?


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

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.


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]>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.