web-dev-qa-db-fra.com

Comment obtenir l'heure UTC en Python?

J'ai cherché une solution sur StackExchange, mais rien ne répond vraiment à mes besoins. En JavaScript, j'utilise les éléments suivants pour calculer l'heure UTC depuis le 1er janvier 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;
}

Quel serait le code équivalent Python?

90
James Clarke

Essayez ce code qui utilise datetime.utcnow () :

from datetime import datetime
datetime.utcnow()

Lorsque vous avez besoin de calculer le temps passé entre deux dates, il vous suffit de soustraire les dates de fin et de début. Le résultat de cette soustraction est un objet timedelta.

À partir de la docs python:

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

Et cela signifie que par défaut, vous pouvez obtenir n’importe lequel des champs mentionnés dans sa définition: jours, secondes, microsecondes, millisecondes, minutes, heures, semaines. De plus, l'instance timedelta a la méthode total_seconds () qui:

Renvoie le nombre total de secondes contenues dans la durée. Équivalent à (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6)/10 * 6 calculé avec true division activée.

145
Artsiom Rudzenka

Sous la forme la plus proche de votre original:

import datetime

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

Si vous avez besoin de connaître le nombre de secondes écoulées entre le 01/07/1970 et non un Pythonnatif, _ datetime, utilisez ceci à la place:

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

Python a des conventions de nommage qui sont en contradiction avec ce à quoi vous pourriez être habitué en Javascript, voir PEP 8 . En outre, une fonction qui renvoie simplement le résultat d'une autre fonction est plutôt stupide; s'il s'agit simplement de la rendre plus accessible, vous pouvez créer un autre nom pour une fonction en l'attribuant simplement. Le premier exemple ci-dessus pourrait être remplacé par:

utc_now = datetime.datetime.utcnow
35
Mark Ransom
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) 
16
MikeL

Depuis datetime.datetime, vous pouvez déjà exporter des horodatages avec la méthode strftime. En suivant votre exemple de fonction:

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

Si vous voulez des microsecondes, vous devez modifier la chaîne d'exportation et le transtyper comme suit: return float(now.strftime("%s.%f"))

7
hectorcanto

Dans Python 3 en utilisant l'expression lambda, essayez;

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

et appelez la fonction normalement;

print(utc_now())
4
STREET MONEY

Prise en compte du fuseau horaire sans aucune dépendance externe:

from datetime import datetime, timezone

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