Blog Emmanuel Orchanian

astuce bdd bureautique codage culture débat design énigme français hacking html mathématiques méthodologie santé typographie 

 

 [149 vues] 2022-02-22 Emmanuel Orchanian

NOTE : cet article a été affiché dans sa langue originale.

Anatomie d'une date

Je considère une date comme composée de trois éléments : le jour, le mois, et l'année.

Bien sûr,

Trois manières de disposer une date

  • Ordre croissant (comme en France) : jour mois année
  • Ordre inverse de croissant, chocolatine : décroissant (comme dans les bases de données) : année mois jour
  • Ordre américain : mois jour année
différents formats de dates
Différentes dispositions des dates

Lequel est le meilleur ? (pour le codeur)

L'ordre décroissant en mettant les zéros devant, parce ce qu'il est à la fois triable dans l'ordre numérique et alphabétique, par exemple :

    01/01/2050
    31/12/1970
    2050-01-01
    31/12/1970

Attention ! On ne dit pas que c'est triable de manière croissante ou décroissante, on dit que :

  • Seule la disposition année-mois-jour est triable en général
  • La disposition jour-mois-année ou américaine ne sont pas triables du tout !

Je vous conseille de nommer vos fichiers et dossiers selon les dates dans l'ordre décroissant

En effet, ainsi il deviennent triable, voir l'article à ce sujet.

exemple de rangement de dossiers datés dans Windows
Je conseille de nommer vos fichiers ou dossiers datés dans l'ordre année-mois-jour+nom

Parlons des séparateurs

Le séparateur est le signe qui va être entre chaque élément.

  • 31/12/2000 slash, comme en français
  • 31-12-2000 traits d'union, comme en écriture de bases de données
  • 31 12 2000 espace, naturellement
  • 31_12_2000 underscore, comme on peux le faire pour les nombres en PHP
  • 31122000 rien, pour accoler et ainsi avoir un nombre qui définit la date

Comparer des dates

Le SQL peux directement comparer les dates

Selon beaucoup de langages, 31-12-2000 ne pourra pas être un nombre mais un texte, ainsi on ne pourra pas faire des comparaison de dates.

Mais en SQL, on a le droit de comparer des dates, par exemple WHERE date > '2000-01-01'

Enlever les séparateurs et transformer en nombre

  1. "31-12-2001"
  2. "31122001" on enlève les séparateurs en accolant tout
  3. 31122001 on transforme en nombre

On peux alors comparer date > 20000101

Par exemple je vais comparer si le 1er janvier 2000 tombe après le 11 novembre 1999 ?

Je les transforme en nombre et je fais une simple comparaison mathématique

    1er janvier 2000
    = "2000-01-01"
    = 20000101
    = 20 000 101 (vingt millions cent un)

    11 novembre 1999 = "1999-11-11"
    = 19991111
    = 19 991 111 (dix-neuf millions 991 mille 111)

    20000101 > 19991111

Passage en objet

Dans la plupart des langages, on utilisera le passage en objet ou l'utilisation de fonctions pour manipuler les dates.

Ça peux permettre de vérifier par exemple si une date apertient au calendrier grégorien, par exemple le 31-02-1990 n'existe pas, car février n'a pas 31 jours !

Exemple de code en PHP en passant par des fonctions


    // FUSEAU HORAIRE
    date_default_timezone_set('Europe/Paris');

    // date php
    $obj_date = date_create('1999-12-31');
    date_modify($obj_date, '+1 day');
    echo date_format($obj_date, 'd/m/Y'); // écrira la date au format français "31/12/1990"

Et les date-heures ?

Trois manières générales de noter le temps

  1. Date 2000-31-12
  2. Heure 13:51:48 (heure, minutes, secondes)
  3. Date-heure (datetime), c'est les deux : 2000-31-12 13:51:48

Écriture des heures

On a de la chance, c'est souvent le signe deux-points :

Et concernant l'ordre, c'est toujours décroissant, heure-minutes-secondes, personnellement je n'ai jamais vu écrire d'abord les minutes puis les heures...

Dans Windows, le signe :est interdit pour nommer les fichiers, certains utilisent alors le signe point-virgule ; qui lui ressemble. 16;10;59

Note : le séparateur entre la date et l'heure est souvent l'espace 2000-01-01 16:10:59

Comparaison des dates-heure

C'est la même logique : le SQL le fait pas défaut
WHERE datetime > '2000-01-01 23:59:20'

    1er janvier 2000 à 16h10 et 59 secondes
    = "2000-01-01 16:10:59"
    = 20000101161059
    = 20 000 101 161 059 (vingt mille milliard de mille sabord)

    20000101161059 > 19991111000000

Méthode personnelle

Depuis un certain temps, pour mes petits projets personnels, je me rends compte que le système le plus paresseux et rapide, mais pas le plus professionnel, c'est de mettre sous forme de nombres. Par exemple 13 novembre 1990 deviens 19901113, cela permet ainsi les comparaisons entre nombres, de la même manière que le SQL.

J'apelle ça les "dateint", voici une fonction pour y placer des


    function dateint2dateslash(int $_d){ // TODO: mettre en ligne
        // $sep = '/';
        $sep = '-';
        $a = substr($_d,0,4);
        $m = substr($_d,4,2);
        $j = substr($_d,6,2);
        return $a.$sep.$m.$sep.$j; // pour le coté informatique
        // return $j.$sep.$m.$sep.$a;
    }

Merci d'avoir lu !
Si en général vous avez une question, une curiosité, n'hésitez pas me contacter.