Outils pour utilisateurs

Outils du site


issue203:python

Fun and Games with Dates Greetings fellow Beings. I hope that your year is going well for you so far. I suppose that I really should preface this month’s article by explaining the title. “Fun and Games with Dates” really isn’t what I wanted to name this month’s article. In reality, it’s more like “Pain, Suffering and Angst with Dates”. But like the old dad joke “Why does McDonalds call them ‘Happy Meals’? Because if they called them ‘Sad Meals’, no one would buy them!”, I figured if I named it ‘My horrible experience with Dates’, either you wouldn’t want to read it OR you would assume that I was talking about an experience trying to date someone. This article started with an idea for my Micro This Micro That article series. This weekend (as I’m writing this) is the switch to Daylight Saving Time here in most of the U.S. and I was thinking about a Microcontroller program that needs to keep track of the actual time and date, making sure that, after a power failure or reboot of the device, the device goes up to the internet, gets the current time and date. Then what happens when Daylight Saving time hits? Here in the U.S. we change to Daylight Saving on the Second Sunday of March at 02:00 and change back to “Standard” time the first Sunday in November at 02:00. Never having lived in any other part of the world, and time change has not been a major conversation topic between my international friends and myself, I wondered if the rest of the world had this issue. With a little digging on the Internet, I found out.

Jeux et amusements avec les dates

Salutations, chers amis. J'espère que l'année se passe bien pour vous.

Je suppose que je devrais vraiment commencer l'article de ce mois en expliquant le titre. Je n'ai pas vraiment voulu intituler mon article « Jeux et amusements avec les dates ». En réalité, il s'agit plutôt de « Douleur, souffrance et angoisse avec les dates ». Mais comme la vieille blague « Pourquoi McDonalds les appelle-t-il des 'Happy Meals' ? Parce que s'ils les appelaient 'Sad Meals', personne ne les achèterait ! », je me suis dit que si j'intitulais l'article « Mes horribles expériences avec les dates », soit vous ne voudriez pas le lire, soit vous supposeriez que je parle d'une expérience où j'ai essayé de sortir avec quelqu'un.

Cet article est parti d'une idée pour ma série d'articles Micro-ci Micro-là. Ce week-end (au moment où j'écris ces lignes), nous passons à l'heure d'été dans la plupart des États-Unis et je pensais à un programme de microcontrôleur qui doit garder la trace de l'heure et de la date réelles, en s'assurant que, après une panne de courant ou un redémarrage de l'appareil, celui-ci se connecte à Internet et obtient l'heure et la date actuelles. Que se passe-t-il ensuite lorsque l'heure d'été arrive ? Ici, aux États-Unis, nous passons à l'heure d'été le deuxième dimanche de mars à 02h00 et revenons à l'heure « normale » le premier dimanche de novembre à 02h00. N'ayant jamais vécu dans une autre partie du monde et le changement d'heure n'étant pas un sujet de conversation majeur entre mes amis internationaux et moi-même, je me suis demandé si le reste du monde était confronté à ce problème. En fouillant un peu sur Internet, j'ai trouvé la réponse.

Some areas of the world change to Daylight Saving on the Second Sunday in March at 02:00, some on the Second Sunday in March at 00:00, some on the last Sunday in March at 01:00 UTC, some on the Last Sunday in March at 02:00, some on the Friday before the last Sunday in March, some on the last Friday in April at 00:00, some on the first Sunday in October at 00:00, and others at even more difficult times to remember, unless you live there. And the switch back to “regular” time can even be more convoluted. (https://en.wikipedia.org/wiki/Daylight_saving_time_by_country#) Knowing this caused me to push things around in the “to write about” queue and sit down and start digging into research and testing code. So keeping with proper programming protocol, I needed to define the issue and lay out the steps that will need to be taken to complete the task. For those of us that identify with “human” (as opposed to silicon based computer lifeforms), the task is easy. IF this is the day before a time change, then… IF the change adds an hour, then.. Before going to bed, move the clock ahead one hour. ELSE IF the change subtracts an hour, then… Before going to bed, move the clock back one hour. ELSE IF the change adds 30 minutes, then… Before going to bed, move the clock ahead 30 minutes. ELSE IF the change subtracts 30 minutes, then… Before going to bed, move the clock back 30 minutes. ELSE Get rid of all the analogue clocks in the house and let the computers handle things!

Certaines régions du monde passent à l'heure d'été le deuxième dimanche de mars à 02h00, d'autres le deuxième dimanche de mars à 00h00, d'autres le dernier dimanche de mars à 01h00 UTC, d'autres le dernier dimanche de mars à 02h00, d'autres le vendredi précédant le dernier dimanche de mars, d'autres le dernier vendredi d'avril à 00h00, d'autres le premier dimanche d'octobre à 00h00, et d'autres encore à des moments encore plus difficiles à mémoriser, à moins d'y habiter. Et le retour à l'heure « normale » peut être encore plus compliqué. (https://en.wikipedia.org/wiki/Daylight_saving_time_by_country#)

Sachant cela, j'ai réorganisé la file d'attente « à écrire » et je me suis assis pour commencer à creuser en recherchant et testant du code.

Pour respecter le protocole de programmation, j'ai dû définir le problème et exposer les étapes à suivre pour mener à bien la tâche.

Pour ceux d'entre nous qui s'identifient aux « humains » (par opposition aux formes de vie informatiques basées sur le silicium), la tâche est facile.

SI nous sommes la veille d'un changement d'heure, alors… SI le changement ajoute une heure, alors…

   Avant d'aller au lit, avancer l'horloge d'une heure.

OU SI le changement soustrait une heure, alors…

   Avant d'aller au lit, reculez l'horloge d'une heure.

OU SI le changement ajoute 30 minutes, alors…

   Avant de vous coucher, avancez l'horloge de 30 minutes.

OU SI le changement entraîne une soustraction de 30 minutes, alors…

   Avant d'aller au lit, reculez l'horloge de 30 minutes.

OU

   Débarrassez-vous de toutes les horloges analogiques de la maison et laissez les ordinateurs s'en charger !

Ok. MAYBE I over simplified the situation and the ending ELSE task MIGHT be a bit drastic, but hey. What can I say? AND YES, there is an area in the world that only changes the time by 30 minutes. Anyway, now how do we go about coding this? I won’t bore you with 10 pages of failed attempts (not that they were all failed attempts, but none that I was pleased with). I will, however, share the solution that I found that I liked. The key to the entire thing is to use a library named dateutil. It’s simple to install with pip. To walk you through the process, I’ll use PtPython. Once you have it installed, we can import it and datetime (top right). Once we have that we want to find the first Sunday of the month. Since we imported everything from dateutil.relativedelta, that includes weekday and a two-character abbreviation for the days of the week. In our case, we want “SU” for Sunday (below). While we are here, let’s get the date for the End of Daylight Saving time (in the U.S.) which is the FIRST Sunday in November 2024. This time, it’s easier, since we don’t need to add the 7 days (bottom right). I created two one-liners for all of the above steps. I simply added a year variable instead of “hardcoding” the year in the datetime.date call (below).

D'accord. J'ai peut-être trop simplifié la situation et la fin de la tâche “OU” est peut-être un peu radicale, mais bon. Que dire ? Et OUI, il y a une zone dans le monde qui ne change l'heure que de 30 minutes.

Quoi qu'il en soit, comment allons-nous coder cela ? Je ne vais pas vous ennuyer avec 10 pages de tentatives ratées (non pas qu'elles l'aient toutes été, mais aucune ne m'a satisfait). Je vais cependant partager la solution que j'ai trouvée et qui m'a plu.

La clé de tout cela est l'utilisation d'une bibliothèque nommée dateutil. Elle est simple à installer avec pip. Pour vous guider dans le processus, j'utiliserai PtPython. Une fois la bibliothèque installée, nous pouvons l'importer ainsi que datetime (en haut à droite).

Une fois que nous avons cela, nous voulons trouver le premier dimanche du mois. Puisque nous avons tout importé de dateutil.relativedelta, cela inclut le jour de la semaine et une abréviation de deux caractères pour les jours de la semaine. Dans notre cas, nous voulons « SU » pour Sunday (ci-dessous).

Pendant que nous y sommes, obtenons la date de la fin de l'heure d'été (aux États-Unis) qui est le PREMIER dimanche de novembre 2024. Cette fois-ci, c'est plus facile, car nous n'avons pas besoin d'ajouter les 7 jours (en bas à droite).

J'ai créé deux lignes simples pour toutes les étapes ci-dessus. J'ai simplement ajouté une variable year au lieu de coder en dur l'année dans l'appel datetime.date (ci-dessous).

Now that we have our one-liners defined, we can use it to find any Daylight Saving time start and end dates. So for the US, here's a quick program that will get the start and end dates for the years from 2024 to 2030 (next page, top right). That’s all well and good, but I feel that it’s safe to assume that there are many fewer readers of FCM in the U.S. than there are in the rest of the world. The second largest group of countries (which probably includes you, dear reader) starts their time change on the last Sunday of March at 00:00 UTC and ends it on the last Sunday of October at 01:00 UTC. It’s a very simple task to modify the code to handle the last Sunday instead of the second Sunday. So we can use a bit of syntax change for our relativedelta call. dstStart = datetime.date(year, 3, 1) + relativedelta(day=31, weekday=SU(-1)) In this case, we will give it the same datetime.date value, but we’ll want to set the relativedelta to start its calculations from the 31st of the month and find the nearest Sunday with a “-1” modifier, since we are going back from the 31st. For the last Sunday of October, that’s a simple change from 3 for the month (in the datetime.date) to 10. dstEnd = datetime.date(year, 10, 1) + relativedelta(day=31, weekday=SU(-1)) So making the changes to the above program the code would be (bottom right)…

Maintenant que nous avons défini nos deux lignes simples, nous pouvons les utiliser pour trouver les dates de début et de fin de l'heure d'été. Ainsi, pour les États-Unis, voici un programme rapide qui permet d'obtenir les dates de début et de fin pour les années 2024 à 2030 (page suivante, en haut à droite).

C'est bien beau, mais je pense que l'on peut supposer qu'il y a beaucoup moins de lecteurs du FCM aux États-Unis qu'il n'y en a dans le reste du monde. Le deuxième groupe de pays le plus important (dont vous faites probablement partie, cher lecteur) commence son changement d'heure le dernier dimanche de mars à 00h00 UTC et le termine le dernier dimanche d'octobre à 01h00 UTC.

Il est très simple de modifier le code pour gérer le dernier dimanche au lieu du deuxième dimanche.

Nous pouvons donc utiliser un changement de syntaxe pour notre appel relativedelta.

dstStart = datetime.date(year, 3, 1) + relativedelta(day=31, weekday=SU(-1))

Dans ce cas, nous lui donnerons la même valeur datetime.date, mais nous voulons configurer le relativedelta pour qu'il commence ses calculs à partir du 31 du mois et trouve le dimanche le plus proche avec un modificateur « -1 », puisque nous revenons en arrière à partir du 31. Pour le dernier dimanche d'octobre, il suffit de passer de 3 pour le mois (dans datetime.date) à 10.

dstEnd = datetime.date(year, 10, 1) + relativedelta(day=31, weekday=SU(-1))

En modifiant le programme ci-dessus, le code serait donc (en bas à droite).

So until someone gets things changed, this will do. For those of you who don’t fall into the first two groups, you should have enough information to change things to get the dates for the time changes for your country. If you want to learn more about the dateutil package, the documentation can be found at https://dateutil.readthedocs.io/en/stable/index.html . Remember that this whole thing started because I wanted to have a Microcontroller know when the time change actually occurs. We have addressed only the date portion. The time part has yet to be finished. That will be shown in my Micro This Micro That article in this month’s Full Circle Magazine. I’ve placed the code for the two sample programs on my github repository at https://github.com/gregwa1953/FCM-203. Until next time, as always; stay safe, healthy, positive and creative!

Jusqu'à ce que quelqu'un fasse changer les choses, cela suffira. Pour ceux d'entre vous qui ne font pas partie des deux premiers groupes, vous devriez avoir suffisamment d'informations pour modifier le code afin d'obtenir les dates des changements d'heure pour votre pays.

Si vous voulez en savoir plus sur le paquetage dateutil, la documentation se trouve à l'adresse https://dateutil.readthedocs.io/en/stable/index.html .

Rappelez-vous que tout ceci a commencé parce que je voulais qu'un microcontrôleur sache quand le changement d'heure se produit réellement. Nous n'avons abordé que la partie date. La partie relative à l'heure n'est pas encore terminée. Elle sera présentée dans mon article Micro-ci micro-là dans le magazine Full Circle de ce mois-ci.

J'ai placé le code des deux exemples de programmes sur mon dépôt github à l'adresse https://github.com/gregwa1953/FCM-203.

Jusqu'à la prochaine fois, comme toujours, restez en sécurité, en bonne santé, positif et créatif !

lignes noires de l'encadré p 31, en haut à droite Next, we need to get a start date, which in our case will be March 1, 2024, and it needs to be a type of ..

Ensuite, nous devons obtenir la date de début, qui dans notre cas est le 1er mars 2024 et elle doit être du type datetime.date

lignes noires de l'encadré p 31, en bas à gauche So the first Sunday of March 2024 is the third. Now that we know that, we just need to add 7 days.

Ainsi, le premier dimanche de mars 2024 est le 3. Maintenant que nous le savons, il suffit d'ajouter 7 jours.

So, the beginning (in the U.S.) of Daylight Saving time in 2024 is March 10. We could also have used the following line instead of “(days=+7)”. Ainsi, en 2024, l'heure d'été commence (aux États-Unis) le 10 mars. Nous aurions tout aussi bien pu utiliser la ligne suivante à la place de « (days=+7) ».

Which would return the same date. Just two ways of doing the same thing.

Qui retourne la même date. Simplement, deux façons de faire la même chose.

lignes noires des encadrés p 32, en haut à droite And the output would be…

Et la sortie serait :

And the output is… Et la sortie est :

issue203/python.txt · Dernière modification : 2024/04/03 16:58 de andre_domenech