IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Arithmétique des dates


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 92
    Points
    92
    Par défaut Arithmétique des dates
    Bonjour,

    Vos expériences seront les bienvenues.


    L’arithmétique des DATES est loin d’être un problème trivial.
    Je connais quelques ingénieurs qui s’y sont cassés les dents dessus et assez longtemps.
    Moi-même, je peux en attraper des boutons.

    Déjà, je vais commencer par la base :

    Le typage des dates :

    J’ai pris la liberté de « doubler » chacun des formats de dates (selon IBM) par le même nom mais suivi d’un « C »
    comme « condensé » : exemple ISO et ISOC.
    Et dans la suite de mes propos quand ce citerais ISO, c’est de ISOC dont je parlerai.
    A vous de supprimer les séparateurs.

    Date ISO : AAAA-MM-JJ ISOC : AAAAMMJJ
    Date USA : MM/JJ/AAAA USAC : MMJJAAAA
    Date EUR : JJ.MM.AAAA EURC : JJMMAAAA
    Date JIS : AAAA-MM-JJ JISC : AAAAMMJJ

    Pour simplifier encore, je vais partir du principe que toutes les opérations seront faites sur des dates ISO(c).
    Donc à vous de convertir votre format de date avec les méthodes USA->ISO ou EUR->ISO
    Vous voyez que cela se complique.

    Glossaire :
    AAAA année sur 4 chiffres
    MM mois sur 2 chiffres
    JJ jour sur 2 chiffres
    hh heure sur 2 chiffres
    mn minutes sur 2 chiffres
    ss secondes sur 2 chiffres
    ml millisecondes sur 3 chiffres


    Arithmétique des Dates : Exemples

    Comparer 2 dates (ISO)
    comparer 20000131 avec 20010131 : résultat : plus petit, égal, plus grand

    ajouter/enlever(n) jours à une date (ISO)
    enlever 1 (jour) à 20120301 : résultat : 20120229

    différence entre 2 dates (en années/mois/jours)
    différence entre 20120229 et 20120301 : résultat : 0000/00/01
    différence entre 20130229 et 20130301 : résultat : 0000/00/00 !!
    de plus on pourrait vouloir rendre cette différence d’une façon différente (en jours par exemple)
    différence entre 20120301 et 20120228 : résultat : 0000/00/01
    remarquez qu’ici on ne donne pas le sens (si on pense à une soustraction)

    dernier jour du mois (pour cette date)
    pour 201202xx : résultat 29 (2 chiffres)

    quantième (pour cette date)
    (le quantième est le nombre de jours dans l’année pour arriver à cette date)
    pour 20120103 : résultat : 003 (3 chiffres)

    date pour ce quantième
    il faut donner aussi l’année et le quantième sur 3 chiffres
    pour 2012003 (année/quantième) : résultat : 20120103

    nombre de jours dans l'année
    pour 2012MMjj (ou 2012) : résultat : 366


    nombre de jours dans le mois
    pour 201202xx : résultat : 29 (2 chiffres)


    plus de précision ?
    ajouter(AAAAMMJJhhmnssml) à (AAAAMMJJhhmnssml) ISO
    (à vous de jouer)


    on complique un peu avec les fuseaux horaires ?
    date universelle
    heure universelle
    je vous renvoie à notre ami Google !


    maintenant les prises de têtes :

    différence entre 2 périodes (ISO)
    une période commence à une date début (AAAAMMJJ) et se termine à une date de fin (ISO).
    La période comprend la date de début ET la date de fin. Ex : du 1er au 20 janvier.
    Il faut se mettre d’accord sur ce que l’on compare : la période P1 avec la période P2,
    ou bien la période P2 avec la période P1. Car le résultat ne sera pas nécessairement le même !


    explications :
    Comparer
    P1 : du 6 mai 2013 au 24 mai 2013
    P2 : du 15 mai 2013 au 31 mai 2013
    Outer-left : du 6 au 14 mai, cette partie de P1 est en dehors de P2
    Inner : du 15 au 24 mai (ces périodes sont communes)
    Outer-rigth : du 25 au 31 mai (cette partie n’est pas dans P1)
    Comparer
    P1 : du 15 mai 2013 au 31 mai 2013
    P2 : du 6 mai 2013 au 24 mai 2013
    Outer-left : du 6 au 14 mai, cette partie est en dehors de P1
    Inner : du 15 au 24 mai (ces périodes sont communes)
    Outer-rigth : du 25 au 31 mai (cette partie de P1 n’est pas dans P2)

    Le résultat semble être le même, mais fonctionnellement parlant ? qu’en est-il ?

    Et encore je n'ai choisi que 2 périodes à comparer !

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Faire de l'arithmétique avec des bases différentes, c'est toujours un problème. D'autant plus sur des espaces mathématiques qui ne sont ni des corps, ni des anneaux.

    Ma réponse à ce genre de problème: supprimer le problème.

    1. convertir les valeurs dans la même base et sur un anneau => Unix time, GMT+0.
    2. faire toutes les opérations dans cet espace.
    3. convertir le résultat dans la base / format de votre choix.


    Il y a plein de librairies robustes pour faire les opérations 1 et 3. Pour l'opération 2, on est sur des formules simples.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 92
    Points
    92
    Par défaut
    En fait,
    en dehors du basic trivial que j’ai commencé à citer plus haut,
    je voulais surtout parler des « prises de tête ».

    Exemple

    Je lis le fichier des voyageurs TGV depuis une gare de départ vers une (ou plusieurs) gares d’arrivée.
    On me donne une date de référence sous la forme AAAAMM qui me sert à chercher tous les voyageurs
    qui ont réservé leur billet à MM-1 pour un voyage qui a eu lieu au mois MM de l’année de référence( ?).
    Je cherche ceux qui ont voyagé entre le 10 et le 15 du mois.
    Sauf si leur date de voyage est un jour férié (dimanche, 1er mai,..)
    Sauf s’il y avait une promotion exceptionnelle (période) au moment de leur réservation.
    Et sauf si le jour du voyage est compris dans une (période) classée rouge.
    J’ai à ma disposition les jours fériés (méthode), les périodes de promotion exceptionnelle,
    Les période classées rouge. Le fichier me donne aussi : date de réservation, date de départ.
    L’arithmétique, ce n’est pas QUE répondre à la question « combien font 1+1 ? » .
    C’est moins simple. Mais j’ai d’autres exemples beaucoup plus compliqués.

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par duboisa Voir le message
    En fait,
    en dehors du basic trivial que j’ai commencé à citer plus haut,
    je voulais surtout parler des « prises de tête ».

    Exemple

    Je lis le fichier des voyageurs TGV depuis une gare de départ vers une (ou plusieurs) gares d’arrivée.
    On me donne une date de référence sous la forme AAAAMM qui me sert à chercher tous les voyageurs
    qui ont réservé leur billet à MM-1 pour un voyage qui a eu lieu au mois MM de l’année de référence( ?).
    Je cherche ceux qui ont voyagé entre le 10 et le 15 du mois.
    Sauf si leur date de voyage est un jour férié (dimanche, 1er mai,..)
    Sauf s’il y avait une promotion exceptionnelle (période) au moment de leur réservation.
    Et sauf si le jour du voyage est compris dans une (période) classée rouge.
    J’ai à ma disposition les jours fériés (méthode), les périodes de promotion exceptionnelle,
    Les période classées rouge. Le fichier me donne aussi : date de réservation, date de départ.
    L’arithmétique, ce n’est pas QUE répondre à la question « combien font 1+1 ? » .
    C’est moins simple. Mais j’ai d’autres exemples beaucoup plus compliqués.
    Les opérations que tu cites sont des recherches et des exclusions d'éléments selon des critères date/time. Au final ce sont des opérations ensemblistes ou arithmétiques.

    J'ai une liste d'éléments qui sont des couples (nom,valeur)
    On me donne une valeur de référence vref.
    Je récupère tous les élements dont la valeur est dans l'intervalle [vref1,vref2]
    J'exclue les éléments dont la valeur est dans [vref3,vref4] ou [vref5,vref6] ou ...

    La simplicité de ces opérations élémentaires permet de construire des algos très efficaces pour traiter des grands volumes de données. Par exemple le MapReduce de Google.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Saisie des dates
    Par J-P-B dans le forum XMLRAD
    Réponses: 5
    Dernier message: 04/07/2003, 11h08
  2. Manipuler des dates...
    Par Ti Jen-tsie dans le forum Langage
    Réponses: 4
    Dernier message: 26/06/2003, 11h46
  3. [MCD] [MCD] Gestion des dates
    Par brionne dans le forum Schéma
    Réponses: 3
    Dernier message: 30/05/2003, 13h01
  4. Réponses: 3
    Dernier message: 19/03/2003, 15h19
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo