Será que time.time()
no módulo de tempo Python retornar hora do sistema ou a hora em UTC?
Será que time.time()
no módulo de tempo Python retornar hora do sistema ou a hora em UTC?
Respostas:
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 ts
variável é o tempo retornado em segundos. Em seguida, converti-o em uma string usando a datetime
biblioteca, tornando-a legível por humanos.
import time
quando datetime, basicamente fornece um carimbo de data / hora. Basta remover os milissegundos -str(datetime.datetime.now()).split('.')[0]
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).
É 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 now
difere do utcnow
esperado, 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
import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()
Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
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.
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.
type(time.time())
gives<type 'float'>
int()
é polimórfico. Ele retornaria, long
se necessário, nas versões antigas do Python - todos os números inteiros são longos nas novas versões do Python.
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?
datetime.utcfromtimestamp
enquanto há 308 upvotes em uma resposta com datetime.fromtimestamp
:-(
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).
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.
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.
Acabei me contentando com:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
time.time()
retorna decimal / float 1574115250.818733
e milissegundos desde a época é fácil, int(time.time() * 1000)
por exemplo, #1574115254915
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.
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 arrow
com 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]>