Comment obtenir l'heure UTC en Python?

113

J'ai cherché une solution sur StackExchange, mais rien ne fait tout ce dont j'ai besoin. En JavaScript, j'utilise ce qui suit 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 Python équivalent?

James Clarke
la source
Attendez, utilisez-vous Python ou JavaScript?
CheetSheatOverlode

Réponses:

179

Essayez ce code qui utilise datetime.utcnow () :

from datetime import datetime
datetime.utcnow()

Pour vos besoins, lorsque vous devez calculer un temps passé entre deux dates, il vous suffit de soustraire les dates de fin et de début. Le résultat d'une telle soustraction est un objet timedelta.

À partir de la documentation Python:

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

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

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

Artsiom Rudzenka
la source
2
peut-être mauvaise surprise à propos de datetime.utcnow () est qu'il ne renvoie pas un objet sensible au fuseau horaire malgré le nom. C'est à mon avis un gros problème, c'est pourquoi je préfère ma réponse ci-dessous. Voir "Les objets datetime sans fuseau horaire doivent être considérés comme un" bogue "dans l'application." julien.danjou.info/python-and-timezones
Tim Richardson
1
Le concept d'un objet datetime soi-disant naïf (c'est-à-dire qu'aucune information de fuseau horaire n'est définie) a un but: je veux que mon réveil sonne à 06:00:00 tous les jours, peu importe où je me trouve dans le monde. En outre, il permet des "horloges virtuelles" dans les jeux informatiques disons: il est maintenant 17 heures dans mon monde fantastique. Forcer un fuseau horaire sur l'objet datetime serait gênant, en particulier avec l'arithmétique timedelta.
DustByte
42

Dans 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 à partir du 01/01/1970 plutôt que d'un Python natif datetime, utilisez plutôt ceci:

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

Python a des conventions de dénomination qui sont en contradiction avec ce à quoi vous pourriez être habitué en Javascript, voir PEP 8 . De plus, une fonction qui renvoie simplement le résultat d'une autre fonction est plutôt idiote; 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
Mark Ransom
la source
1
J'aime mieux votre réponse que la réponse la mieux notée ci-dessus. Merci pour la profondeur ici.
Jordan Dea-Mattson
@Jordan, en repensant à ma réponse, je me rends compte que j'ai commis une erreur stylistique en mettant l'importation dans la fonction plutôt qu'au niveau global, je vais corriger cela maintenant.
Mark Ransom
8
Vous devriez peut-être envisager d'encapsuler UtcNow () dans une autre fonction. C'est trop simple. N'utilisez pas non plus de traits de soulignement. PEP 8 est tellement ennuyeux ...
vcarel
1
Certainement pas besoin d'écrire une fonction pour renvoyer un simple one-liner ... datetime.datetime.utcnow ()
cpreid
1
@TimRichardson Je ne suis pas en désaccord, mais au moment où cette réponse a été écrite, il n'y avait pas d'alternative - Python n'incluait aucun tzinfoobjet, même pour UTC.
Mark Ransom
31

Bibliothèque standard simple uniquement, pour python moderne. Donne une datetime tenant compte du fuseau horaire, contrairement à datetime.utcnow(). datetimessans fuseaux horaires, des accidents attendent de se produire.

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)
Tim Richardson
la source
5
Selon la documentation Python 3, c'est la manière recommandée de le faire.
roskakori
Propre et facile! Cela devrait être le moyen préféré.
Marry35
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
la source
10

Depuis datetime.datetime, vous pouvez déjà exporter vers 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 changer la chaîne d'exportation et la transtyper en flottant comme: return float(now.strftime("%s.%f"))

Hectorcanto
la source
Quel est l'intérêt de convertir en une chaîne, puis de revenir en nombre lorsque vous pouvez obtenir le nombre directement?
Mark Ransom
Le fait est que vous voudrez peut-être changer les choses sur la fonction et pour cette raison, il vaut mieux s'en tenir à l'objet datetime, sans utiliser time.time(), vous pouvez également utiliser time.mktime (now.timetuple ()) pour convertir directement en int. Quoi qu'il en soit, pour ce cas simple time.time()est également une option valable. Ce que je trouve étrange, c'est de passer par timedelta pour trouver les secondes.
hectorcanto
Notez que cela strftime("%s")dépend de la plate-forme et ne fonctionne pas sous Windows. (Du moins, ce n'est pas le cas pour moi sur Windows 10).
Julian Kirsch
8

Fuseau horaire conscient avec zéro dépendances externes:

from datetime import datetime, timezone

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

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())
ARGENT DE RUE
la source
2
soyez gentils maintenant les enfants; ^)
Demis