Guide du débutant du module de temps Python

Guide du débutant du module de temps Python

Le module Pythontime fournit de nombreuses façons de représenter le temps dans le code, telles que des objets, des nombres et des chaînes. Il fournit également des fonctionnalités autres que la représentation du temps, comme l'attente pendant l'exécution de code et la mesure de l'efficacité de votre code.

Cet article vous expliquera les fonctions et objets les plus couramment utilisés danstime.

À la fin de cet article, vous serez en mesure de:

  • Les concepts de base deUnderstand au cœur de l'utilisation des dates et des heures, telles que les époques, les fuseaux horaires et l'heure d'été

  • Represent temps dans le code en utilisant des flottants, des tuples etstruct_time

  • Convert entre différentes représentations temporelles

  • Exécution du threadSuspend

  • Performances du codeMeasure avecperf_counter()

Vous allez commencer par découvrir comment utiliser un nombre à virgule flottante pour représenter le temps.

Free Bonus:Click here to get our free Python Cheat Sheet qui vous montre les bases de Python 3, comme travailler avec des types de données, des dictionnaires, des listes et des fonctions Python.

Gérer le temps Python en utilisant des secondes

L'une des façons dont vous pouvez gérer le concept de temps Python dans votre application consiste à utiliser un nombre à virgule flottante qui représente le nombre de secondes qui se sont écoulées depuis le début d'une ère, c'est-à-dire depuis un certain point de départ.

Explorons plus en détail ce que cela signifie, pourquoi il est utile et comment vous pouvez l'utiliser pour implémenter la logique, basée sur le temps Python, dans votre application.

L'époque

Vous avez appris dans la section précédente que vous pouvez gérer le temps Python avec un nombre à virgule flottante représentant le temps écoulé depuis le début d'une époque.

Merriam-Webster définit une ère comme:

  • Un point dans le temps à partir duquel une série d'années est comptée

  • Un système de notation chronologique calculé à partir d'une date donnée comme base

Le concept important à saisir ici est que, lorsque vous traitez avec le temps Python, vous envisagez une période de temps identifiée par un point de départ. En informatique, vous appelez ce point de départ lesepoch.

L'époque est donc le point de départ par rapport auquel vous pouvez mesurer le passage du temps.

Par exemple, si vous définissez l’époque comme étant minuit le 1er janvier 1970 UTC (l’époque telle que définie sur Windows et la plupart des systèmes UNIX), vous pouvez représenter minuit le 2 janvier 1970 UTC en86400 secondes depuis l’époque. .

En effet, il y a 60 secondes par minute, 60 minutes par heure et 24 heures par jour. Le 2 janvier 1970 UTC n'est qu'un jour après l'époque, vous pouvez donc appliquer les mathématiques de base pour arriver à ce résultat:

>>>

>>> 60 * 60 * 24
86400

Il est également important de noter que vous pouvez toujours représenter le temps avant l'époque. Le nombre de secondes serait juste négatif.

Par exemple, vous représenteriez minuit le 31 décembre 1969 UTC (en utilisant une époque du 1er janvier 1970) en-86400 secondes.

Alors que le 1er janvier 1970 UTC est une époque courante, ce n'est pas la seule époque utilisée en informatique. En fait, différents systèmes d'exploitation, systèmes de fichiers et API utilisent parfois des époques différentes.

Comme vous l'avez vu précédemment, les systèmes UNIX définissent l'époque comme le 1er janvier 1970. L'API Win32, d'autre part, définit l'époque commeJanuary 1, 1601.

Vous pouvez utilisertime.gmtime() pour déterminer l’époque de votre système:

>>>

>>> import time
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

Vous en apprendrez davantage surgmtime() etstruct_time tout au long de cet article. Pour l'instant, sachez simplement que vous pouvez utilisertime pour découvrir l'époque en utilisant cette fonction.

Maintenant que vous en savez plus sur la façon de mesurer le temps en secondes à l’aide d’une époque, jetons un œil au moduletime de Python pour voir quelles fonctions il offre qui vous aident à le faire.

Temps Python en secondes comme nombre à virgule flottante

Tout d'abord,time.time() renvoie le nombre de secondes qui se sont écoulées depuis l'époque. La valeur de retour est un nombre à virgule flottante pour tenir compte des fractions de seconde:

>>>

>>> from time import time
>>> time()
1551143536.9323719

Le numéro que vous obtenez sur votre machine peut être très différent car le point de référence considéré comme l'époque peut être très différent.

Further Reading: Python 3.7 a introduittime_ns(), qui renvoie une valeur entière représentant le même temps écoulé depuis l'époque, mais en nanosecondes plutôt qu'en secondes.

La mesure du temps en secondes est utile pour plusieurs raisons:

  • Vous pouvez utiliser un flotteur pour calculer la différence entre deux points dans le temps.

  • Un float est facilementserializable, ce qui signifie qu'il peut être stocké pour le transfert de données et ressortir intact de l'autre côté.

Parfois, cependant, vous souhaiterez peut-être voir l'heure actuelle représentée sous forme de chaîne. Pour ce faire, vous pouvez passer le nombre de secondes que vous obtenez detime() entime.ctime().

Temps Python en secondes sous forme de chaîne représentant l'heure locale

Comme vous l'avez vu précédemment, vous pouvez convertir l'heure Python, représentée par le nombre de secondes écoulées depuis l'époque, enstring. Vous pouvez le faire en utilisantctime():

>>>

>>> from time import time, ctime
>>> t = time()
>>> ctime(t)
'Mon Feb 25 19:11:59 2019'

Ici, vous avez enregistré l’heure actuelle en secondes dans la variablet, puis passét comme argument àctime(), qui renvoie une représentation sous forme de chaîne de cette même heure.

Technical Detail: L'argument, représentant les secondes depuis l'époque, est facultatif selon la définition dectime(). Si vous ne passez pas d'argument, alorsctime() utilise la valeur de retour detime() par défaut. Ainsi, vous pouvez simplifier l'exemple ci-dessus:

>>>

>>> from time import ctime
>>> ctime()
'Mon Feb 25 19:11:59 2019'

La représentation sous forme de chaîne du temps, également appeléetimestamp, renvoyée parctime() est formatée avec la structure suivante:

  1. Day of the week:Mon (Monday)

  2. Month of the year:Feb (February)

  3. Jour du mois: 25

  4. Heures, minutes et secondes en utilisant la notation24-hour clock: 19:11:59

  5. Année: 2019

L'exemple précédent affiche l'horodatage d'un moment particulier capturé à partir d'un ordinateur dans la région Centre-Sud des États-Unis. Mais disons que vous vivez à Sydney, en Australie, et que vous avez exécuté la même commande au même instant.

Au lieu de la sortie ci-dessus, vous voyez ce qui suit:

>>>

>>> from time import time, ctime
>>> t = time()
>>> ctime(t)
'Tue Feb 26 12:11:59 2019'

Notez que les partiesday of week,day of month ethour de l'horodatage sont différentes de celles du premier exemple.

Ces sorties sont différentes car l'horodatage renvoyé parctime() dépend de votre emplacement géographique.

Note: Bien que le concept de fuseau horaire soit relatif à votre emplacement physique, vous pouvez le modifier dans les paramètres de votre ordinateur sans le déplacer.

La représentation du temps dépendant de votre emplacement physique est appeléelocal time et utilise un concept appelétime zones.

Note: Puisque l'heure locale est liée à vos paramètres régionaux, les horodatages tiennent souvent compte des détails spécifiques aux paramètres régionaux tels que l'ordre des éléments dans la chaîne et les traductions des abréviations du jour et du mois. ctime() ignore ces détails.

Examinons un peu plus en profondeur la notion de fuseaux horaires afin de mieux comprendre les représentations temporelles Python.

Comprendre les fuseaux horaires

Un fuseau horaire est une région du monde conforme à une heure standardisée. Les fuseaux horaires sont définis par leur décalage par rapport àCoordinated Universal Time (UTC) et, potentiellement, par l'inclusion de l'heure d'été (que nous aborderons plus en détail plus loin dans cet article).

Fun Fact: Si vous êtes de langue maternelle anglaise, vous vous demandez peut-être pourquoi l’abréviation de «Temps universel coordonné» est UTC plutôt que CUT, plus évidente. Cependant, si vous êtes de langue maternelle française, vous l'appeleriez «Temps Universel Coordonné», ce qui suggère une abréviation différente: TUC.

En fin de compte, lesInternational Telecommunication Union and the International Astronomical Union compromised on UTC comme abréviation officielle de sorte que, quelle que soit la langue, l'abréviation serait la même.

UTC et fuseaux horaires

L'UTC est la norme de temps par rapport à laquelle tout le chronométrage mondial est synchronisé (ou coordonné). Ce n'est pas, en soi, un fuseau horaire mais plutôt une norme transcendante qui définit ce que sont les fuseaux horaires.

L'heure UTC est mesurée avec précision en utilisantastronomical time, se référant à la rotation de la Terre, etatomic clocks.

Les fuseaux horaires sont ensuite définis par leur décalage par rapport à l'UTC. Par exemple, en Amérique du Nord et du Sud, le fuseau horaire central (CT) est en retard de cinq ou six heures sur UTC et, par conséquent, utilise la notation UTC-5: 00 ou UTC-6: 00.

Sydney, en Australie, en revanche, appartient au fuseau horaire australien (AET), qui a dix ou onze heures d'avance sur UTC (UTC + 10: 00 ou UTC + 11: 00).

Cette différence (UTC-6: 00 à UTC + 10: 00) est la raison de la variance que vous avez observée dans les deux sorties dectime() dans les exemples précédents:

  • Heure centrale (CT): 'Mon Feb 25 19:11:59 2019'

  • Heure de l'Est de l'Australie (AET): 'Tue Feb 26 12:11:59 2019'

Ces heures sont exactement séparées de seize heures, ce qui est cohérent avec les décalages de fuseau horaire mentionnés ci-dessus.

Vous vous demandez peut-être pourquoi CT peut avoir cinq ou six heures de retard sur UTC ou pourquoi AET peut avoir dix ou onze heures d'avance. La raison en est que certaines régions du monde, y compris des parties de ces fuseaux horaires, observent l'heure d'été.

Le temps de l'heure d'été

Les mois d'été connaissent généralement plus dedaylight hoursque les mois d'hiver. Pour cette raison, certaines régions observent l'heure d'été (DST) au printemps et en été pour mieux utiliser ces heures de lumière du jour.

Pour les endroits qui observent l'heure d'été, leurs horloges avanceront d'une heure au début du printemps (perdant effectivement une heure). Puis, à l'automne, les horloges seront remises à l'heure standard.

Les lettres S et D représentent l'heure standard et l'heure d'été en notation de fuseau horaire:

  • Heure normale du Centre (CST)

  • Heure d'été australienne (AEDT)

Lorsque vous représentez des heures sous forme d'horodatages dans l'heure locale, il est toujours important de déterminer si l'heure d'été est applicable ou non.

ctime() représente l'heure d'été. Ainsi, la différence de sortie répertoriée précédemment serait plus précise comme suit:

  • Heure normale du centre (CST): 'Mon Feb 25 19:11:59 2019'

  • Heure avancée de l'est de l'Australie (AEDT): 'Tue Feb 26 12:11:59 2019'

Gérer le temps Python à l'aide de structures de données

Maintenant que vous maîtrisez bien de nombreux concepts fondamentaux du temps, notamment les époques, les fuseaux horaires et l'UTC, examinons d'autres façons de représenter le temps à l'aide du module Pythontime.

Python Time en tant que tuple

Au lieu d'utiliser un nombre pour représenter l'heure Python, vous pouvez utiliser une autre structure de données primitive: atuple.

Le tuple vous permet de gérer le temps un peu plus facilement en extrayant certaines des données et en les rendant plus lisibles.

Lorsque vous représentez le temps comme un tuple, chaque élément de votre tuple correspond à un élément spécifique du temps:

  1. Year

  2. Mois sous forme d'entier compris entre 1 (janvier) et 12 (décembre)

  3. Jour du mois

  4. Heure sous forme d'entier, comprise entre 0 (12 h) et 23 (11 h)

  5. Minute

  6. Seconde

  7. Jour de la semaine sous forme d'entier, compris entre 0 (lundi) et 6 (dimanche)

  8. Jour de l'année

  9. Heure d'été sous forme d'entier avec les valeurs suivantes:

    • 1 correspond à l'heure d'été.

    • 0 est l'heure standard.

    • -1 est inconnu.

En utilisant les méthodes que vous avez déjà apprises, vous pouvez représenter le même temps Python de deux manières différentes:

>>>

>>> from time import time, ctime
>>> t = time()
>>> t
1551186415.360564
>>> ctime(t)
'Tue Feb 26 07:06:55 2019'

>>> time_tuple = (2019, 2, 26, 7, 6, 55, 1, 57, 0)

Dans ce cas,t ettime_tuple représentent le même temps, mais le tuple fournit une interface plus lisible pour travailler avec des composants de temps.

Technical Detail: En fait, si vous regardez l'heure Python représentée partime_tuple en secondes (ce que vous verrez comment faire plus loin dans cet article), vous verrez qu'elle se résout en1551186415.0 plutôt que1551186415.360564.

En effet, le tuple n'a pas de moyen de représenter les fractions de seconde.

Alors que le tuple fournit une interface plus gérable pour travailler avec le temps Python, il existe un objet encore meilleur:struct_time.

Le temps Python en tant qu'objet

Le problème avec la construction de tuple est qu'elle ressemble toujours à un tas de nombres, même si elle est mieux organisée qu'un nombre unique basé sur des secondes.

struct_time fournit une solution à ce problème en utilisantNamedTuple, du modulecollections de Python, pour associer la séquence de nombres du tuple à des identifiants utiles:

>>>

>>> from time import struct_time
>>> time_tuple = (2019, 2, 26, 7, 6, 55, 1, 57, 0)
>>> time_obj = struct_time(time_tuple)
>>> time_obj
time.struct_time(tm_year=2019, tm_mon=2, tm_mday=26, tm_hour=7, tm_min=6, tm_sec=55, tm_wday=1, tm_yday=57, tm_isdst=0)

Technical Detail: Si vous venez d'une autre langue, les termesstruct etobject peuvent être en opposition l'un avec l'autre.

En Python, il n'y a pas de type de données appeléstruct. Au lieu de cela, tout est un objet.

Cependant, le nomstruct_time est dérivé desC-based time library où le type de données est en fait unstruct.

En fait, le moduletime de Python, qui estimplemented in C, utilise cestruct directement en incluant le fichier d’en-têtetimes.h.

Désormais, vous pouvez accéder à des éléments spécifiques detime_obj en utilisant le nom de l’attribut plutôt qu’un index:

>>>

>>> day_of_year = time_obj.tm_yday
>>> day_of_year
57
>>> day_of_month = time_obj.tm_mday
>>> day_of_month
26

Au-delà de la lisibilité et de l'utilisabilité destruct_time, il est également important de le savoir car il s'agit du type de retour de nombreuses fonctions du module Pythontime.

Conversion du temps Python en secondes en un objet

Maintenant que vous avez vu les trois principales méthodes de travail avec le temps Python, vous allez apprendre à convertir entre les différents types de données de temps.

La conversion entre les types de données d'heure dépend de l'heure en UTC ou en heure locale.

Temps universel coordonné (UTC)

L'époque utilise UTC pour sa définition plutôt qu'un fuseau horaire. Par conséquent, les secondes se sont écoulées depuis l'époque n'est pas variable en fonction de votre situation géographique.

Cependant, on ne peut pas en dire autant destruct_time. La représentation objet de l'heure Python peut ou non prendre en compte votre fuseau horaire.

Il existe deux façons de convertir un flottant représentant des secondes enstruct_time:

  1. UTC

  2. Heure locale

Pour convertir un flottant temporel Python en unstruct_time basé sur UTC, le module Pythontime fournit une fonction appeléegmtime().

Vous avez déjà vugmtime() utilisé une fois dans cet article:

>>>

>>> import time
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

Vous avez utilisé cet appel pour découvrir l'époque de votre système. Maintenant, vous avez une meilleure base pour comprendre ce qui se passe réellement ici.

gmtime() convertit le nombre de secondes écoulées depuis l'époque enstruct_time en UTC. Dans ce cas, vous avez passé0 comme nombre de secondes, ce qui signifie que vous essayez de trouver l’époque elle-même en UTC.

Note: Notez que l'attributtm_isdst est défini sur0. Cet attribut indique si le fuseau horaire utilise l'heure d'été. UTC ne s'abonne jamais à DST, donc cet indicateur sera toujours0 lors de l'utilisation degmtime().

Comme vous l'avez vu précédemment,struct_time ne peut pas représenter des fractions de seconde, doncgmtime() ignore les fractions de seconde dans l'argument:

>>>

>>> import time
>>> time.gmtime(1.99)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=1, tm_wday=3, tm_yday=1, tm_isdst=0)

Notez que même si le nombre de secondes que vous avez passé était très proche de2, les fractions de seconde de.99 étaient simplement ignorées, comme le montretm_sec=1.

Le paramètresecs pourgmtime() est facultatif, ce qui signifie que vous pouvez appelergmtime() sans argument. Cela fournira l'heure actuelle en UTC:

>>>

>>> import time
>>> time.gmtime()
time.struct_time(tm_year=2019, tm_mon=2, tm_mday=28, tm_hour=12, tm_min=57, tm_sec=24, tm_wday=3, tm_yday=59, tm_isdst=0)

Fait intéressant, il n'y a pas d'inverse pour cette fonction à l'intérieur detime. Au lieu de cela, vous devrez chercher dans le modulecalendar de Python une fonction nomméetimegm():

>>>

>>> import calendar
>>> import time
>>> time.gmtime()
time.struct_time(tm_year=2019, tm_mon=2, tm_mday=28, tm_hour=13, tm_min=23, tm_sec=12, tm_wday=3, tm_yday=59, tm_isdst=0)
>>> calendar.timegm(time.gmtime())
1551360204

timegm() prend un tuple (oustruct_time, puisqu'il s'agit d'une sous-classe de tuple) et retourne le nombre de secondes correspondant depuis l'époque.

Historical Context: Si vous souhaitez savoir pourquoitimegm() n'est pas danstime, vous pouvez afficher la discussion enPython Issue 6280.

En bref, il a été initialement ajouté àcalendar parce quetime suit de près la bibliothèque de temps de C (définie danstime.h), qui ne contient aucune fonction correspondante. Le problème mentionné ci-dessus a proposé l'idée de déplacer ou de copiertimegm() danstime.

Cependant, avec les avancées de la bibliothèquedatetime, des incohérences dans l'implémentation corrigée detime.timegm() et une question sur la façon de gérer ensuitecalendar.timegm(), les responsables ont décliné le patch, encourageant l'utilisation dedatetime à la place.

Travailler avec UTC est précieux dans la programmation car c'est une norme. Vous n'avez pas à vous soucier de l'heure d'été, du fuseau horaire ou des informations locales.

Cela dit, il existe de nombreux cas où vous souhaitez utiliser l'heure locale. Ensuite, vous verrez comment convertir des secondes en heure locale pour pouvoir faire exactement cela.

Heure locale

Dans votre application, vous devrez peut-être travailler avec l'heure locale plutôt qu'avec UTC. Le moduletime de Python fournit une fonction pour obtenir l’heure locale à partir du nombre de secondes écoulées depuis l’époque appeléelocaltime().

La signature delocaltime() est similaire àgmtime() en ce qu'elle prend un argument optionnelsecs, qu'il utilise pour construire unstruct_time en utilisant votre fuseau horaire local:

>>>

>>> import time
>>> time.time()
1551448206.86196
>>> time.localtime(1551448206.86196)
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=7, tm_min=50, tm_sec=6, tm_wday=4, tm_yday=60, tm_isdst=0)

Notez quetm_isdst=0. Étant donné que l'heure d'été est importante avec l'heure locale,tm_isdst changera entre0 et1 selon que l'heure d'été est applicable ou non pour l'heure donnée. Depuistm_isdst=0, l'heure d'été n'est pas applicable pour le 1er mars 2019.

Aux États-Unis en 2019, l'heure d'été commence le 10 mars. Donc, pour tester si l’indicateur DST changera correctement, vous devez ajouter 9 jours de secondes à l’argumentsecs.

Pour calculer cela, vous prenez le nombre de secondes dans une journée (86 400) et multipliez cela par 9 jours:

>>>

>>> new_secs = 1551448206.86196 + (86400 * 9)
>>> time.localtime(new_secs)
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=10, tm_hour=8, tm_min=50, tm_sec=6, tm_wday=6, tm_yday=69, tm_isdst=1)

Maintenant, vous verrez que lestruct_time indique la date du 10 mars 2019 avectm_isdst=1. Notez également quetm_hour est également passé à8 au lieu de7 dans l'exemple précédent, en raison de l'heure d'été.

Depuis Python 3.3,struct_time a également inclus deux attributs utiles pour déterminer le fuseau horaire desstruct_time:

  1. tm_zone

  2. tm_gmtoff

Au début, ces attributs dépendaient de la plateforme, mais ils étaient disponibles sur toutes les plateformes depuis Python 3.6.

Tout d'abord,tm_zone stocke le fuseau horaire local:

>>>

>>> import time
>>> current_local = time.localtime()
>>> current_local.tm_zone
'CST'

Ici, vous pouvez voir quelocaltime() renvoie unstruct_time avec le fuseau horaire réglé surCST (heure normale du centre).

Comme vous l'avez vu précédemment, vous pouvez également indiquer le fuseau horaire en fonction de deux informations, le décalage UTC et l'heure d'été (le cas échéant):

>>>

>>> import time
>>> current_local = time.localtime()
>>> current_local.tm_gmtoff
-21600
>>> current_local.tm_isdst
0

Dans ce cas, vous pouvez voir quecurrent_local est21600 secondes derrière GMT, ce qui signifie Greenwich Mean Time. GMT est le fuseau horaire sans décalage UTC: UTC ± 00: 00.

21600 secondes divisé par secondes par heure (3600) signifie que le temps decurrent_local estGMT-06:00 (ouUTC-06:00).

Vous pouvez utiliser le décalage GMT plus le statut DST pour déduire quecurrent_local estUTC-06:00 à l'heure standard, ce qui correspond au fuseau horaire standard central.

Commegmtime(), vous pouvez ignorer l'argumentsecs lors de l'appel delocaltime(), et il retournera l'heure locale actuelle dans unstruct_time:

>>>

>>> import time
>>> time.localtime()
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=8, tm_min=34, tm_sec=28, tm_wday=4, tm_yday=60, tm_isdst=0)

Contrairement àgmtime(), la fonction inverse delocaltime() existe dans le module Pythontime. Voyons comment cela fonctionne.

Conversion d'un objet de temps local en secondes

Vous avez déjà vu comment convertir un objet d'heure UTC en secondes à l'aide decalendar.timegm(). Pour convertir l'heure locale en secondes, vous utiliserezmktime().

mktime() vous oblige à passer un paramètre appelét qui prend la forme d'un 9-tuple normal ou d'un objetstruct_time représentant l'heure locale:

>>>

>>> import time

>>> time_tuple = (2019, 3, 10, 8, 50, 6, 6, 69, 1)
>>> time.mktime(time_tuple)
1552225806.0

>>> time_struct = time.struct_time(time_tuple)
>>> time.mktime(time_struct)
1552225806.0

Il est important de garder à l'esprit quet doit être un tuple représentant l'heure locale et non UTC:

>>>

>>> from time import gmtime, mktime

>>> # 1
>>> current_utc = time.gmtime()
>>> current_utc
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=14, tm_min=51, tm_sec=19, tm_wday=4, tm_yday=60, tm_isdst=0)

>>> # 2
>>> current_utc_secs = mktime(current_utc)
>>> current_utc_secs
1551473479.0

>>> # 3
>>> time.gmtime(current_utc_secs)
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=20, tm_min=51, tm_sec=19, tm_wday=4, tm_yday=60, tm_isdst=0)

Note: Pour cet exemple, supposons que l'heure locale estMarch 1, 2019 08:51:19 CST.

Cet exemple montre pourquoi il est important d'utilisermktime() avec l'heure locale, plutôt que UTC:

  1. gmtime() sans argument renvoie unstruct_time en utilisant UTC. current_utc afficheMarch 1, 2019 14:51:19 UTC. Ceci est exact carCST is UTC-06:00, donc UTC doit être 6 heures en avance sur l'heure locale.

  2. mktime() essaie de renvoyer le nombre de secondes, en attendant l'heure locale, mais vous avez passécurrent_utc à la place. Donc, au lieu de comprendre quecurrent_utc est l'heure UTC, cela suppose que vous vouliez direMarch 1, 2019 14:51:19 CST.

  3. gmtime() est ensuite utilisé pour convertir ces secondes en UTC, ce qui entraîne une incohérence. Le temps est maintenantMarch 1, 2019 20:51:19 UTC. La raison de cet écart est le fait quemktime() heure locale prévue. Ainsi, la conversion en UTC ajouteanother 6 heures à l'heure locale.

Travailler avec des fuseaux horaires est notoirement difficile, il est donc important de vous préparer au succès en comprenant les différences entre l'heure UTC et l'heure locale et les fonctions horaires Python qui les traitent.

Conversion d'un objet temporel Python en chaîne

Bien que travailler avec des tuples soit amusant et tout, il est parfois préférable de travailler avec des cordes.

Les représentations sous forme de chaîne du temps, également appelées horodatages, contribuent à rendre les heures plus lisibles et peuvent être particulièrement utiles pour créer des interfaces utilisateur intuitives.

Il existe deux fonctions Pythontime que vous utilisez pour convertir un objettime.struct_time en chaîne:

  1. asctime()

  2. strftime()

Vous commencerez par découvrir`asctime () `.

asctime()

Vous utilisezasctime() pour convertir un temps tuple oustruct_time en horodatage:

>>>

>>> import time
>>> time.asctime(time.gmtime())
'Fri Mar  1 18:42:08 2019'
>>> time.asctime(time.localtime())
'Fri Mar  1 12:42:15 2019'

Les deuxgmtime() etlocaltime() renvoient des instancesstruct_time, respectivement pour l'heure UTC et locale.

Vous pouvez utiliserasctime() pour convertir soitstruct_time en un horodatage. asctime() fonctionne de manière similaire àctime(), dont vous avez entendu parler plus haut dans cet article, sauf qu'au lieu de passer un nombre à virgule flottante, vous passez un tuple. Même le format d'horodatage est le même entre les deux fonctions.

Comme pourctime(), le paramètre pourasctime() est facultatif. Si vous ne passez pas d'objet de temps àasctime(), alors il utilisera l'heure locale actuelle:

>>>

>>> import time
>>> time.asctime()
'Fri Mar  1 12:56:07 2019'

Comme avecctime(), il ignore également les informations locales.

L'un des plus gros inconvénients deasctime() est sa rigidité de format. strftime() résout ce problème en vous permettant de formater vos horodatages.

strftime()

Vous pouvez vous trouver dans une position où le format de chaîne dectime() etasctime() n'est pas satisfaisant pour votre application. Au lieu de cela, vous souhaiterez peut-être formater vos chaînes de manière plus significative pour vos utilisateurs.

Par exemple, si vous souhaitez afficher votre heure dans une chaîne qui prend en compte les informations locales.

Pour formater des chaînes, étant donné un tuple de tempsstruct_time ou Python, vous utilisezstrftime(), qui signifie «stringformat time».

strftime() prend deux arguments:

  1. format spécifie l'ordre et la forme des éléments de temps dans votre chaîne.

  2. t est un tuple de temps facultatif.

Pour formater une chaîne, vous utilisezdirectives. Les directives sont des séquences de caractères qui commencent par un% qui spécifient un élément de temps particulier, tel que:

  • %d: Jour du mois

  • %m: Mois de l'année

  • %Y: Année

Par exemple, vous pouvez afficher la date dans votre heure locale en utilisant la normeISO 8601 comme ceci:

>>>

>>> import time
>>> time.strftime('%Y-%m-%d', time.localtime())
'2019-03-01'

Further Reading: Bien que la représentation des dates à l'aide de l'heure Python soit tout à fait valide et acceptable, vous devriez également envisager d'utiliser le moduledatetime de Python, qui fournit des raccourcis et un cadre plus robuste pour travailler avec les dates et les heures ensemble.

Par exemple, vous pouvez simplifier la sortie d'une date au format ISO 8601 en utilisantdatetime:

>>>

>>> from datetime import date
>>> date(year=2019, month=3, day=1).isoformat()
'2019-03-01'

Comme vous l'avez vu précédemment, un grand avantage de l'utilisation destrftime() surasctime() est sa capacité à rendre les horodatages qui utilisent des informations spécifiques aux paramètres régionaux.

Par exemple, si vous souhaitez représenter la date et l’heure en tenant compte des paramètres régionaux, vous ne pouvez pas utiliserasctime():

>>>

>>> from time import asctime
>>> asctime()
'Sat Mar  2 15:21:14 2019'

>>> import locale
>>> locale.setlocale(locale.LC_TIME, 'zh_HK')  # Chinese - Hong Kong
'zh_HK'
>>> asctime()
'Sat Mar  2 15:58:49 2019'

Notez que même après avoir modifié vos paramètres régionaux par programme,asctime() renvoie toujours la date et l'heure dans le même format qu'auparavant.

Technical Detail:LC_TIME est la catégorie locale pour le formatage de la date et de l'heure. L'argumentlocale'zh_HK' peut être différent, selon votre système.

Cependant, lorsque vous utilisezstrftime(), vous verrez qu'il tient compte des paramètres régionaux:

>>>

>>> from time import strftime, localtime
>>> strftime('%c', localtime())
'Sat Mar  2 15:23:20 2019'

>>> import locale
>>> locale.setlocale(locale.LC_TIME, 'zh_HK')  # Chinese - Hong Kong
'zh_HK'
>>> strftime('%c', localtime())
'六  3/ 2 15:58:12 2019' 2019'

Ici, vous avez utilisé avec succès les informations locales car vous avez utiliséstrftime().

Note:%c est la directive pour la date et l'heure appropriées aux paramètres régionaux.

Si le tuple de temps n'est pas passé au paramètret, alorsstrftime() utilisera le résultat delocaltime() par défaut. Ainsi, vous pouvez simplifier les exemples ci-dessus en supprimant le deuxième argument facultatif:

>>>

>>> from time import strftime
>>> strftime('The current local datetime is: %c')
'The current local datetime is: Fri Mar  1 23:18:32 2019'

Ici, vous avez utilisé l'heure par défaut au lieu de passer la vôtre comme argument. Notez également que l'argumentformat peut être constitué de texte autre que les directives de formatage.

Further Reading: Vérifiez ceslist of directives approfondis disponibles pourstrftime().

Le module Pythontime inclut également l'opération inverse de conversion d'un horodatage en un objetstruct_time.

Conversion d'une chaîne temporelle Python en un objet

Lorsque vous travaillez avec des chaînes liées à la date et à l'heure, il peut être très utile de convertir l'horodatage en objet temporel.

Pour convertir une chaîne de temps enstruct_time, vous utilisezstrptime(), qui signifie «stringparse time»:

>>>

>>> from time import strptime
>>> strptime('2019-03-01', '%Y-%m-%d')
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=60, tm_isdst=-1)

Le premier argument destrptime() doit être l'horodatage que vous souhaitez convertir. Le deuxième argument est leformat dans lequel se trouve l'horodatage.

Le paramètreformat est facultatif et vaut par défaut'%a %b %d %H:%M:%S %Y'. Par conséquent, si vous avez un horodatage dans ce format, vous n'avez pas besoin de le passer en argument:

>>>

>>> strptime('Fri Mar 01 23:38:40 2019')
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=23, tm_min=38, tm_sec=40, tm_wday=4, tm_yday=60, tm_isdst=-1)

Étant donné qu'unstruct_time a 9 composants de date et d'heure clés,strptime() doit fournir des valeurs par défaut raisonnables pour les valeurs de ces composants qu'il ne peut pas analyser à partir destring.

Dans les exemples précédents,tm_isdst=-1. Cela signifie questrptime() ne peut pas déterminer par l'horodatage s'il représente l'heure d'été ou non.

Vous savez maintenant comment travailler avec les heures et les dates Python en utilisant le moduletime de différentes manières. Cependant, il existe d'autres utilisations detime en dehors de la simple création d'objets temporels, de l'obtention de chaînes de temps Python et de l'utilisation des secondes écoulées depuis l'époque.

Suspension de l'exécution

Une fonction de temps Python vraiment utile estsleep(), qui suspend l'exécution du thread pendant un laps de temps spécifié.

Par exemple, vous pouvez suspendre l'exécution de votre programme pendant 10 secondes comme ceci:

>>>

>>> from time import sleep, strftime
>>> strftime('%c')
'Fri Mar  1 23:49:26 2019'
>>> sleep(10)
>>> strftime('%c')
'Fri Mar  1 23:49:36 2019'

Votre programme imprimera la première chaîne de caractèresdatetime formatée, puis marquera une pause de 10 secondes et imprimera enfin la deuxième chaîne de caractèresdatetimeformatée.

Vous pouvez également passer des fractions de seconde àsleep():

>>>

>>> from time import sleep
>>> sleep(0.5)

sleep() est utile pour tester ou faire attendre votre programme pour quelque raison que ce soit, mais vous devez faire attention à ne pas interrompre votre code de production à moins que vous n'ayez de bonnes raisons de le faire.

Avant Python 3.5, un signal envoyé à votre processus pouvait interrompresleep(). Cependant, dans 3.5 et versions ultérieures,sleep() suspendra toujours l'exécution pendant au moins la durée spécifiée, même si le processus reçoit un signal.

sleep() n'est qu'une fonction de temps Python qui peut vous aider à tester vos programmes et à les rendre plus robustes.

Mesurer les performances

Vous pouvez utilisertime pour mesurer les performances de votre programme.

Pour ce faire, utilisezperf_counter() qui, comme son nom l'indique, fournit un compteur de performance avec une haute résolution pour mesurer de courtes distances de temps.

Pour utiliserperf_counter(), vous placez un compteur avant le début de l’exécution de votre code ainsi qu’une fois l’exécution de votre code terminée:

>>>

>>> from time import perf_counter
>>> def longrunning_function():
...     for i in range(1, 11):
...         time.sleep(i / i ** 2)
...
>>> start = perf_counter()
>>> longrunning_function()
>>> end = perf_counter()
>>> execution_time = (end - start)
>>> execution_time
8.201258441999926

Tout d'abord,start capture le moment avant que vous appeliez la fonction. end capture le moment après le retour de la fonction. Le temps d’exécution total de la fonction a pris(end - start) secondes.

Technical Detail: Python 3.7 a introduitperf_counter_ns(), qui fonctionne de la même manière queperf_counter(), mais utilise des nanosecondes au lieu de secondes.

perf_counter() (ouperf_counter_ns()) est le moyen le plus précis de mesurer les performances de votre code en une seule exécution. Cependant, si vous essayez d'évaluer avec précision les performances d'un extrait de code, je vous recommande d'utiliser le modulePython timeit.

timeit se spécialise dans l'exécution de code plusieurs fois pour obtenir une analyse des performances plus précise et vous aide à éviter de trop simplifier votre mesure du temps ainsi que d'autres pièges courants.

Conclusion

Toutes nos félicitations! Vous disposez désormais d'une excellente base pour travailler avec les dates et heures en Python.

Maintenant, vous pouvez:

  • Utilisez un nombre à virgule flottante, représentant les secondes écoulées depuis l'époque, pour gérer le temps

  • Gérez le temps à l'aide de tuples et d'objetsstruct_time

  • Conversion entre les secondes, les tuples et les chaînes d'horodatage

  • Suspendre l'exécution d'un thread Python

  • Mesurer les performances à l'aide deperf_counter()

En plus de tout cela, vous avez appris certains concepts fondamentaux concernant la date et l'heure, tels que:

  • Époques

  • UTC

  • Fuseaux horaires

  • Le temps de l'heure d'été

Maintenant, il est temps pour vous d'appliquer vos nouvelles connaissances du temps Python dans vos applications du monde réel!

Lectures complémentaires

Si vous souhaitez continuer à en savoir plus sur l'utilisation des dates et heures en Python, jetez un œil aux modules suivants:

  • datetime: Un module de date et d'heure plus robuste dans la bibliothèque standard de Python

  • timeit: Un module pour mesurer les performances des extraits de code

  • astropy: Datetimes de plus haute précision utilisés en astronomie