Python: Convertir l'horodateur UTC en horodatage UTC

Mon problème: j'ai besoin de convertir un format UTC heure-tuple dans un horodatage UTC. Mais j'ai quelques confusions.

D'abord un peu d'info:

  • time.mktime(tuple): cette fonction renvoie toujours l'horodatage dans local temps.

    C'est la fonction inverse de localtime(). Son argument est le struct_time ou complet 9-n-uplet qui exprime à la fois dans heure locale, pas de l'UTC.

  • calendar.timegm(tuple): renvoie le horodatage UTC à partir du moment tuple

    prend un temps tuple tel que retourné par la gmtime() fonction dans le module, et retourne le timestamp Unix correspondant de la valeur. En fait, temps.gmtime() et timegm() sont des uns et des autres " inverse

Maintenant, nous allons faire un test:

>>> from datetime import datetime
>>> import time
>>> import calendar as cal

>>> utc_now = datetime.utcnow()
>>> now = datetime.now()
>>> utc_now
datetime.datetime(2013, 3, 16, 9, 17, 22, 489225)
>>> now
datetime.datetime(2013, 3, 16, 5, 17, 29, 736903)

>>> time.mktime(datetime.timetuple(utc_now)), time.mktime(datetime.timetuple(now))
(1363439842.0, 1363425449.0)
>>> cal.timegm(datetime.timetuple(utc_now)), cal.timegm(datetime.timetuple(now))
(1363425442, 1363411049)

Pourquoi il y a quatre valeurs différentes? Et lequel est le bon, quand je veux convertir une heure UTC-tuple dans un horodatage UTC?

UPDATTE


Je pense avoir trouvé les réponses à mes confusions, alors laissez-moi vous expliquer.

Tout d'abord, nous avons besoin de savoir quelque chose d'important:

Il y a deux sortes de la date et de l'heure des objets: “naïve” et “conscient”.

Une connaissance de l'objet a une connaissance suffisante de la législation algorithmique et le temps politique des ajustements, tels que le fuseau horaire et l'heure avancée de l'information, à se situer par rapport à d'autres objets de reconnaissance. Une connaissance de l'objet est utilisé pour représenter un moment précis dans le temps qui n'est pas ouvert à l'interprétation [1].

Un naïf objet ne contient pas suffisamment d'informations sans ambiguïté se situer par rapport aux autres date/heure d'objets. Si naïve objet représente le Temps Universel Coordonné (UTC), l'heure locale ou l'heure dans certains autres fuseau horaire est purement pour le programme, comme c'est le programme si un certain nombre représente mètres, miles, ou de la masse. Naïf objets sont faciles à comprendre et à travailler avec, au prix de l'ignorance de certains aspects de la réalité.

Ce que nous obtenons à partir de datetime.utcnow() ou datetime.now() sont "naïfs" des objets. Cela signifie que le datetime objet qui est retourné ne parvient pas, de toute façon, rien dire à propos de votre heure locale ou l'heure UTC, représente "un certain temps". Il vient de encapsule date & l'information en temps (année, mois, jour, heure,minutes, secondes, etc.). Il est de VOTRE responsabilité de les associer à la notion de locale ou UTC.

Alors, rappelez-vous qu'un naïf objet datetime juste représente "un certain temps". Le datetime.now() fonction renvoie un "certain temps" qui est égale à l'heure actuelle, et la datetime.utcnow() fonction renvoie "un certain temps", c'est à l'heure actuelle dans Greenwich en Angleterre (qui est ce que l'UTC est).

Le "certain temps" est juste une valeur de date & temps. Et de noter que sur les différents endroits de la terre, le "certain temps" se produit à des moments différents. Par exemple, si un "certain temps" la valeur est le 1er janvier, 10:30, qu'il sera l'heure actuelle dans Greenwich en Angleterre environ 5 heures AVANT qu'il ne devienne l'heure actuelle à New York.

Par conséquent, nous pouvons voir qu'il y a deux choses: un générique "un certain temps", et la notion que "un certain temps" devient temps actuel à différents endroits à différents "temps". (pas de jeu de mots ici, lire la suite)

Maintenant, nous allons tout d'abord définir ce qu'est "l'époque". Nous savons que "un certain temps" est juste une valeur générique de temps. Puis, l'époque est un "certain temps" qui ont eu lieu dans Greenwich en Angleterre, où les valeurs des paramètres sont les suivants: January 1 1970, 00:00:00.

Un "timestamp" est pas. de secondes qui se sont écoulées depuis épique. Cela signifie que l'horodatage a été 0 quand le temps était Jan 1, 1970, 00:00:00 de Greenwich en Angleterre. Mais l'horodatage était d'environ. (5 * 60 * 60) quand le temps était Jan 1, 1970, 00:00:00 à New York.

>>> tt = datetime.timetuple(datetime(1970, 1, 1, 0, 0, 0))
>>> cal.timegm(tt)
0

Ainsi, nous pouvons voir que la même "peu de temps" valeur de Jan 1, 1970, 00:00:00 a différentes horodateurs lorsque nous changer d'emplacement. C'est pourquoi, lorsque vous parlez d'horodatage, vous devez également dire "ce lieu" est le timestamp liés à l', et combien l'est ou l'ouest que l'emplacement est lié à Greenwich en Angleterre. Cet emplacement est exprimé comme un "fuseau horaire".

Maintenant, chaque système (ordinateur) a un fuseau horaire configuré, et que tous les timestamps liée à celle du fuseau horaire effectivement devenu le "local". L'UTC est la référence mondiale.

Donc, disons que vous avez un X de la valeur pour "un certain temps", qui convertit à:

  • Y timestamp dans votre heure locale
  • Z timestamp au format UTC

alors cela signifie que Y pas. de secondes doivent s'écouler pour "un certain temps" pour devenir l'heure actuelle dans votre emplacement et Z pas de secondes à passer pour que le courant le temps de Greenwich en Angleterre pour devenir "un certain temps".

Maintenant, enfin, revenons-en à nos fonctions mktime et timegm. Ces prendre un temps-tuple, qui est juste une autre représentation pour "un certain temps". N'oubliez pas que nous sommes passer un naïf temps qui n'a pas de notion de locale ou UTC.

Disons X est un tuple représentant un naïf "un certain temps". Puis

  • mktime(X) sera de retour le pas. des secondes qui devra s'écouler pour que vos locaux actuels de temps pour devenir un "certain temps", et
  • timegm(X) sera de retour le pas de secondes qui devra être dépensé pour faire l'heure de Greenwich en Angleterre égale à "un certain temps".

Dans l'exemple ci-dessus, now et utc_now représentent naïf "un certain temps", et quand nous nourrir de ces "quelques temps" des valeurs dans mktime et timegmils suffit de retourner le pas. de secondes à passer pour les emplacements correspondants (votre emplacement et de Greenwich en Angleterre) à avoir leur heure actuelle, que "un certain temps".


Enfin, de retour à mon problème: j'ai besoin de convertir un format UTC heure-tuple dans un horodatage UTC.

Tout d'abord, il n'y a pas de notion de "temps UTC-tuple", c'est juste "un certain temps". Si j'ai besoin de les convertir à l'UTC, j'ai simplement utiliser timegm:

cal.timegm(datetime.timetuple(utc_now))

qui va me donner le timestamp de l'heure UTC actuelle (c'est à dire, l'actuel "un certain temps" en Greenwich en Angleterre).

source d'informationauteur treecoder