Como obter a hora UTC em Python?

113

Eu pesquisei um monte no StackExchange por uma solução, mas nada faz exatamente o que preciso. Em JavaScript, estou usando o seguinte para calcular a hora UTC desde 1º de janeiro de 1970:

function UtcNow() {
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;
}

Qual seria o código Python equivalente?

James Clarke
fonte
Espere, você está usando Python ou JavaScript?
CheetSheatOverlode

Respostas:

179

Experimente este código que usa datetime.utcnow () :

from datetime import datetime
datetime.utcnow()

Para seus propósitos, quando você precisa calcular a quantidade de tempo gasto entre duas datas, tudo o que você precisa é subtrair as datas de início e término. O resultado de tal subtração é um objeto timedelta.

Dos documentos do python:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

E isso significa que, por padrão, você pode obter qualquer um dos campos mencionados em sua definição - dias, segundos, microssegundos, milissegundos, minutos, horas, semanas. Além disso, a instância timedelta tem o método total_seconds () que:

Retorna o número total de segundos contidos na duração. Equivalente a (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6 calculado com a divisão verdadeira habilitada.

Artsiom Rudzenka
fonte
2
possivelmente a surpresa desagradável sobre datetime.utcnow () é que ele não retorna um objeto ciente de fuso horário, apesar do nome. Este é, em minha opinião, um grande problema, por isso prefiro a resposta abaixo. Consulte "objetos datetime sem fuso horário devem ser considerados como um" bug "no aplicativo." julien.danjou.info/python-and-timezones
Tim Richardson
1
O conceito do chamado objeto datetime ingênuo (ou seja, nenhuma informação de fuso horário é definida) tem um propósito: quero que meu despertador toque às 06:00:00 todos os dias, não importa onde eu esteja no mundo. Também permite "relógios virtuais" em, digamos, jogos de computador: agora são 17h no meu mundo de fantasia. Forçar um fuso horário no objeto datetime seria estranho, especialmente com aritmética timedelta.
DustByte
42

Na forma mais próxima do seu original:

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now

Se você precisar saber o número de segundos de 01/01/1970, em vez de um Python nativo datetime, use o seguinte:

return (now - datetime.datetime(1970, 1, 1)).total_seconds()

Python tem convenções de nomenclatura que estão em desacordo com o que você costuma usar em Javascript, consulte PEP 8 . Além disso, uma função que simplesmente retorna o resultado de outra função é bastante tola; se for apenas uma questão de torná-la mais acessível, você pode criar outro nome para uma função simplesmente atribuindo-o. O primeiro exemplo acima pode ser substituído por:

utc_now = datetime.datetime.utcnow
Mark Ransom
fonte
1
Gosto mais da sua resposta do que da resposta acima. Obrigado pela profundidade aqui.
Jordan Dea-Mattson,
@Jordan, revendo minha resposta, percebi que cometi um erro estilístico ao colocar a importação dentro da função em vez de no nível global. Vou consertar isso agora.
Mark Ransom,
8
Talvez você deva considerar usar UtcNow () em outra função. É muito simples. Além disso, não use sublinhados. PEP 8 é tão chato ...
vcarel
1
Definitivamente, não é necessário escrever uma função para retornar uma linha simples ... datetime.datetime.utcnow ()
cpreid
1
@TimRichardson Não discordo, mas no momento em que esta resposta foi escrita não havia alternativa - Python não incluía nenhum tzinfoobjeto, mesmo para UTC.
Mark Ransom
31

Simples, biblioteca padrão apenas, para python moderno. Dá data e hora com reconhecimento de fuso horário, ao contrário datetime.utcnow(). datetimessem fusos horários, os acidentes estão esperando para acontecer.

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)
Tim Richardson
fonte
5
De acordo com a documentação do Python 3, esta é a maneira recomendada de fazer isso.
roskakori
Limpo e fácil! Deve ser a forma preferida.
Casar com 35 de
21
import datetime
import pytz

# datetime object with timezone awareness:
datetime.datetime.now(tz=pytz.utc)

# seconds from epoch:
datetime.datetime.now(tz=pytz.utc).timestamp() 

# ms from epoch:
int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 
MikeL
fonte
10

De datetime.datetime, você já pode exportar para carimbos de data / hora com o método strftime. Seguindo seu exemplo de função:

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))

Se quiser microssegundos, você precisa alterar a string de exportação e converter para flutuar como: return float(now.strftime("%s.%f"))

Hectorcanto
fonte
Qual é o ponto de converter em uma string e depois voltar a um número quando você pode obter o número diretamente?
Mark Ransom
O ponto é que você pode querer mudar coisas na função e por esse motivo é melhor ficar com o objeto datetime, não usando time.time(). Você também pode usar time.mktime (now.timetuple ()) para converter diretamente para int. Enfim, para este caso simples time.time()também é uma opção válida. O que eu acho estranho, é passar pelo timedelta até achar os segundos.
hectorcanto
Observe que isso strftime("%s")depende da plataforma e não funciona no Windows. (Pelo menos não para mim no Windows 10).
Julian Kirsch
8

Fuso horário ciente com zero dependências externas:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)
Cesar Canassa
fonte
-4

Em Python 3 usando a expressão lambda, experimente;

from datetime import datetime
utc_now = lambda : datetime.utcnow()

e chamar a função normalmente;

print(utc_now())
DINHEIRO DE RUA
fonte
2
sejam legais agora, crianças; ^)
Demis,