.. _activite3 : *********************************************************************************************** Activité 3 |:| Gestion des dates et des durées (2h) *********************************************************************************************** ==================================== Représenter une date (jour + heure) ==================================== La **date** (extrait de `Wikipédia - Date `_) est, au sens usuel, une indication de temps visant à définir un **jour** unique, généralement du calendrier grégorien (calendrier divisé en 12 mois), éventuellement associé à un **nom de jour de la semaine** (lundi, mardi, mercredi, ...). On l'utilise notamment pour repérer, avec **l’heure**, un **événement temporel** donné. Il existe plusieurs façons de les représenter dépendantes du pays ou du format de fichiers qui les stockent. ---------------------------------------------------- Format des évènements temporels pour le *pseudo-csv* ---------------------------------------------------- Dans le projet, sera utilisé : * Pour représenter la date, le format ``JJ-MM-AAAA`` (format des Pays-Bas) où : * ``JJ`` désigne le jour (de 00 à 31), * ``MM`` désigne le mois (de 01 à 12), * ``AAAA`` (de 0000 à 9999) désigne l'année. * Pour représenter l'heure, le `système horaire sur 24 heures `_ dans lequel une heure est notée sous la forme ``hh:mm`` (format US, sans secondes), où : * ``hh`` est le nombre d'heures complètes écoulées depuis le dernier jour complet (de 00 à 23) * ``mm`` est le nombre de minutes complètes écoulées depuis la dernière heure complète (de 00 à 59). ----------------------------------------- Format des évènements temporels en `.ics` ----------------------------------------- Les évènements temporels d'un contenu :fichier:`.ics` (rattachés notamment aux identificateurs ``DTSTART`` et ``DTEND`` que vous verrez par la suite) donnent en même temps la date et l'heure, en utilisant le format ``AAAAMMDDThhmmssZ`` où : * ``AAAA`` donne la valeur de l'année (de 0000 à 9999), * ``MM`` donne le mois (de 00 à 12), * ``DD`` le jour (de 00 à 31), * ``hh`` l'heure (de 00 à 23), * ``mm`` les minutes (de 00 à 59) * ``ss`` les secondes (de 00 à 59) Le caractère ``"T"`` (toujours présent) sépare la date de l'heure ; le caractère ``"Z"`` (optionnel) donne une indication sur le fuseau horaire. En reprenant l'exemple de l'activité précédente (cf. :ref:`exemple_evenement_ics`), la date de début de l'événement donnée avec ``DTSTART:20211126T080000Z`` indique que l'année ``AAAA`` est 2021, le mois ``MM`` est 11, le jour ``JJ`` est 26 puis (après le ``T``) l'heure ``hh`` est 08, les minutes ``mm`` sont ``00`` et les secondes ``00``. La date obtenue est donc le 26-11-2021 à 08:00. Dans votre projet, chaque évènement temporel récupéré des contenus .ics doit être converti en une date ``JJ-MM-AAAA`` et en une heure ``hh:mm`` (rôle des fonctions :py:func:`projetX.conversion_date` et :py:func:`projetX.conversion_heure`). ===================== Représenter une durée ===================== --------------------------------------------- Format des durées temporelles (courtes) --------------------------------------------- Une durée sépare deux évènements temporels ``debut`` et ``fin`` (par exemple le début et la fin d'un cours). Chacun (dans ce projet) correspond à une date et une heure sans mention des secondes (format *pseudo-csv*). La durée peut s'exprimer sous la forme d'un entier ``nbre_minutes`` traduisant le nombre de minutes qui se sont écoulées entre le ``debut`` et la ``fin``. Dans les données *pseudo-csv* que vous allez générer, la durée d'une séance de cours ne dépassant pas 24h, elle est représentée sous la forme ``hh:mm`` où : * ``hh`` est le nombre d'heures complètes écoulées entre le ``debut`` et la ``fin`` (de 00 à 23), * ``mm`` est le nombre de minutes complètes écoulées depuis la dernière heure complète (de 00 à 59). --------------------------------------------- Format des durées en nombre de jours --------------------------------------------- Lorsque la durée entre deux événements temporels ``debut`` et la ``fin`` dépasse la journée (par exemple la durée entre 2 TP différents de la SAE15), elle sera arrondie à un nombre de jours, sans prise en compte de l'écart horaire séparant les 2 dates. Ce nombre peut être calculé avec la fonction :py:func:`tools_date.nombre_jours` fournie ultérieurement. ================================== Stratégie de prise en main ================================== ----------------------------------------------------------------- Préparer un script Awk ----------------------------------------------------------------- A la racine du répertoire de votre projet (répertoire :file:`~/SAE15`) |:| 1. Créez un nouveau fichier :file:`projet_date.awk` 2. Recopiez le code suivant |:| (par un simple copier-coller) .. code-block:: awk BEGIN { print "Le script commence !" evenement1 = "31-10-2021" evenement2 = "17-01-2022" # Ajoutez votre code après cette ligne, avant l'accolade fermante } 3. Ouvrez un terminal. 4. Placez vous dans le répertoire :file:`SAE15` où vous avez normalement créé votre script. 5. Testez votre script avec la commande |:| .. code-block:: bash awk -f ./projet_date.awk 6. Vous devriez voir s'écrire "Le script commence !" sur votre console. -------------------------------------------------- Préparer la conversion `ics` vers le *pseudo-csv* -------------------------------------------------- * Déclarez deux variables, représentant des événements temporels au format `ics` (par un simple copier-coller) : .. code-block:: python evenement_ics1 = "20211031T080000Z" evenement_ics2 = "20220117T133000Z" * Ecrivez le code pour récupérer dans ``evenement_ics1`` la partie correspondant à la date (ici ``"20211031"``) et celle correspondant à l'heure (ici ``"080000"``) en les rangeant dans 2 variables ``date1`` et ``heure1``. * Dans ``date1`` extrayez uniquement la valeur de l'année, puis la valeur du mois. * Vous êtes prêt à coder les fonctions attendues sur les dates.