Cette année, Kid 1.11 a eu en math le sujet du calcul du temps. Calculer du temps, il n’y a rien de pire : il faut 1000 millisecondes pour faire une seconde, mais 60 secondes pour faire une minute, 60 minutes pour faire une heure puis 24 heures pour faire une journée… Et on ne va pas parler des mois et années.

Le procédé est quand même intéressant. Lors de mes formations, je propose des exercices sur le calcul du temps, et je peux vous dire que pas mal d’adultes on du mal à trouver comment faire. En soi, cela montre l’intérêt de l’enseignement de l’algorithmique.

Dans cet article je vais vous montrer le principe le plus fiable, mais pas forcément très intuitif. Vous verrez que c’est la méthode choisie pour gérer le temps de manière informatique.

Quelques exemples

Commençons par un exemple pour comprendre la difficulté. Il est 21h14, les kids sont au lit. J’ai un épisode de 24 minutes de la série à regarder, à quelle heure est-ce qu’il se terminera ?

Facile, il suffit d’additionner les minutes et on arrive à 21h38.

Ok, maintenant disons que j’en ai deux. Alors il faut multiplier la durée d’un épisode par deux et additionner ce résultat aux minutes. Nous avons alors 48 minutes de vidéo et on arrive à 21h62. Heu…

Faisons plus compliqué, il est 23h17 et mon GPS m’indique qu’il me faut encore 2h52 pour rentrer. On additionne heures et minutes pour arriver à 25h69…

Bon, vous voyez la galère de conversion… Alors la solutions ?

Comment les ordinateurs calculent le temps ?

Les ordinateurs savent gérer le temps, mais il n’est pas représenté dans nos unités. Pour un ordinateur, l’instant actuel (date et heure) est représenté sous la forme du nombre de secondes depuis une date de référence. Ce nombre de secondes est converti lorsque c’est nécessaire, c’est à dire lorsqu’il est affiché.

Le principe pour calculer le temps est donc de tout convertir dans l’unité la plus petite pour votre calcul. Ainsi, pour le premier exemple, il est 21h14. Depuis le début de la journée, nous sommes donc à :

21 \times 60 + 14 = 1274

Soit 1274 minutes (à partir du début de la journée). Nous allons pouvoir ajouter nos durée. Pour le premier cas, nous aurons :

21 \times 60 + 14 + 24 = 1298

Et pour le cas de deux épisodes, nous aurons :

21 \times 60 + 14 + 2 * 24 = 1322

Ces deux valeurs sont la représentation de l’heure en minutes depuis le début de la journée. Je vous laisse faire le calcul pour le GPS 😉

Maintenant que nous avons les valeurs en minutes, nous pouvons les convertir en heures et minutes. Mais évidemment, il ne suffit pas de diviser ce résultat par 60. Pour le premier cas, nous obtiendrons 21,63 h… Ce qui est évidemment incompréhensible. En effet, il ne faut pas faire une division décimale.

L’opération qu’il faut faire, c’est une division euclidienne. La division euclidienne permet d’obtenir deux valeurs : le quotient et le reste. Si nous partons d’un nombre de minutes, le quotient représentera le nombre d’heures et le reste, le nombre restant de minutes.

Ainsi, pour la première durée, la division euclidienne de 1298 par 60 donne :

1298 = 60 \times 21 + 38

Soit 21h38 et pour le cas des deux épisodes, nous avons :

1322 = 60 \times 22 + 2

Soit 22h02.

Bien entendu, dans le cas du GPS, le nombre d’heures sera supérieur à 24, il faudra faire une nouvelle division par 24.

Voilà le principe général : à partir de la donnée complexe (jours, heures, minutes…) la convertir en la donnée la plus simple (minutes ici), faire tous les calculs avec de manière uniforme puis lorsqu’il faut présenter le résultat, le convertir ici grâce à la division euclidienne. À l’école, il faudra évidemment écrire toutes les étapes et les calculer de tête. Évidemment, c’est plus facile avec du code.

Calculer le temps en Python

En Python, ça va être bien plus facile. Python propose en effet deux opérateurs : la division entière dont l’opérateur est // et le reste obtenu par l’opérateur modulo, %. Ainsi, soit une variable total_minutes qui contient le nombre total de minutes que nous souhaitons convertir en heures et minutes, obtenir le nombre d’heures est réalisé par l’instruction :

Et le nombre de minutes restantes est obtenu par l’instruction suivante :

Nous pouvons donc utiliser ces instructions dans une fonction qui retourne une chaine de caractères représentant l’heure (ici en utilisant les f-string) :

Sachez qu’il y a une fonction native, divmod(), qui est la représentation de la division euclidienne car elle retourne un tuple résultat de ces deux opérations :

Vous avez ici un aperçu des possibilités. Je vous laisse évidemment aller plus loin et gérer le jour si nécessaire.

Si vous avez aimé ce post, n’hésitez pas à laisser un commentaire ci-dessous ou sur la page Facebook 😉

À propos de... Darko Stankovski

iT guy, photographe et papa 3.0, je vous fais partager mon expérience et découvertes dans ces domaines. Vous pouvez me suivre sur les liens ci-dessous.