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

Bibliothèques et frameworks PHP Discussion :

[XML] Pb avec comparaison de dates dans un XML


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 11
    Points
    11
    Par défaut [XML] Pb avec comparaison de dates dans un XML
    Bonjour tout le monde,

    Je me permet de poster ici, car j'ai un léger souci.
    En effet, dans mon code, je dois afficher toutes les dates écoulées entre 2 dates ( Date de début de projet et date du jour ).
    Ca, j'ai pu trouver un bout de code que j'ai agrémenté à ma sauce pour le faire.
    Cependant, la contrainte que je n'arrive pas à mettre en place dans mon code, c'est de n'afficher que les dates correspondant à des jours de la semaine. En gros, je dois exclure les Samedis et Dimanches de l'affichage.

    Le code récupéré et modifié ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?php
    $xml = simplexml_load_file('xXxXxXx.xml');
     
     
    function ObtenirDates ($Debut, $Fin) {
        $Start = strtotime ($Debut);
        $End = strtotime ($Fin);
     
        if (false === $Start || false === $End) {
            return false;
        }
        $aStart = explode ('-', $Debut);
        $aEnd = explode ('-', $Fin);
        if (count ($aStart) !== 3 || count ($aEnd) !== 3) {
            return false;
        }
        if (false === checkdate ($aStart[1], $aStart[2], $aStart[0]) || false === checkdate ($aEnd[1], $aEnd[2], $aEnd[0]) || $End <= $Start) {
            return false;
        }
        for ($i = $Start+86400; $i <$End; $i += 86400 ) {
            $Dates[] = strftime ('%d/%m/%Y', $i);
     
        }
        if (isset ($Dates) && !empty ($Dates) ) {
            return $Dates;
        } else {
            return false;
        }
    }
     
    foreach ($xml->task as $tache)
     
    	{
    		// variable $date du style : JJ/MM/AAAA
     
    		$date = explode("/",$tache->start);
     
    	// extraction des jour, mois, an de la date
    			list($d, $m, $y) = explode('/', $tache->start);
    			$timestamp = mktime ($d, $m, $y);
    			$array= array ( $y, $m, $d);
    			$deb = implode ('-', $array );
    			$fin = date ("Y-m-d");
    			$Dates = ObtenirDates ($deb, $fin);
    			echo '<pre>', print_r ($Dates), '</pre>';
     
    	}
     
    ?>
    Quelqu'un aurait il une idée SVP?
    Merci d'avance de bien vouloir aider un débutant du développement...

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Ça me paraît bien compliqué comme code et vos paramètres au niveau de mktime sont erronés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    function date2timestamp($date) {
        if (preg_match('~^(\d{2})([-/])(\d{2})\2(\d{4})$~', $date, $m) && checkdate($m[3], $m[1], $m[4])) {
            return mktime(0, 0, 0, $m[3], $m[1], $m[4]);
        } else if (preg_match('~^(\d{4})([-/])(\d{2})\2(\d{2})$~', $date, $m) && checkdate($m[3], $m[4], $m[1])) {
            return mktime(0, 0, 0, $m[3], $m[4], $m[1]);
        } else {
            die("Problème sur une date : $date");
        }
    }
     
    function tri_par_date($elt) {
        global $tDeb, $tFin; // C'est laid mais ça simplifie
     
        $t = date2timestamp($elt->start);
        return $t >= $tDeb && $t <= $tFin && date('N', $t) < 6; /* Requiert PHP 5.1.0 ou + */
    }
     
    $tDeb = date2timestamp('11/10/2007');
    $tFin = date2timestamp('16/10/2007');
     
    $sxml = simplexml_load_file('tasks.xml');
    $tasks = array_filter($sxml->xpath('//task'), 'tri_par_date');
    foreach ($tasks as $t) {
        printf('%s : %s <br />', $t->start, $t->desc);
    }
    Mon fichier XML de test :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <racine>
        <task>
            <start>10/10/2007</start>
            <desc>mercredi</desc>
        </task>
        <task>
            <start>11/10/2007</start>
            <desc>jeudi</desc>
        </task>
        <task>
            <start>12/10/2007</start>
            <desc>vendredi</desc>
        </task>
        <task>
            <start>13/10/2007</start>
            <desc>samedi</desc>
        </task>
        <task>
            <start>14/10/2007</start>
            <desc>dimanche</desc>
        </task>
        <task>
            <start>15/10/2007</start>
            <desc>lundi</desc>
        </task>
        <task>
            <start>16/10/2007</start>
            <desc>mardi</desc>
        </task>
        <task>
            <start>10/10/2007</start>
            <desc>mercredi</desc>
        </task>
    </racine>

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Merci pour l'indication.
    Toutefois, j'avais écris mon code par rapport à la structure de mon fichier XML ( qui m'est fourni et que je ne peux pas modifier ).

    XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    <?xml version="1.0" encoding="iso-8859-1"?>
    <?xml-stylesheet type='text/xsl' href='forme.xsl'?>
    <tasks resource-id="CS">
    <task id="200701" load="100">
    <start>10/09/2007</start>
    <project>xxxx</project>
    <asker>xxx</asker>
    <name>Tests</name>
    <cat>WEBphp</cat>
    <duedate>19/10/2007</duedate>
    <end/><duration>10</duration>
    <complete/>
    <day id="10" month="09" year="2007">
    <matin>1</matin><apresmidi>1</apresmidi>
    </day>
    <day id="11" month="09" year="2007">
    <matin>1</matin><apresmidi>1</apresmidi>
    </day>
    <day id="12" month="09" year="2007">
    <matin>1</matin><apresmidi>1</apresmidi>
    </day>
    <day id="17" month="09" year="2007">
    <matin>1</matin>
    </day>
    <day id="25" month="09" year="2007">
    <matin>1</matin>
    </day>
    <day id="26" month="09" year="2007">
    <matin>1</matin><apresmidi>1</apresmidi>
    </day>
    <day id="27" month="09" year="2007">
    <apresmidi>1</apresmidi><fini>1</fini>
    </day>
    <day id="28" month="09" year="2007">
    <apresmidi>1</apresmidi>
    </day>
    </task><task id="200702" load="100">
    <start>15/09/2007</start>
    <project>xxxx</project>
    <asker>xxx</asker>
    <name>Tests Bis</name>
    <cat>WEBphp</cat>
    <duedate>19/10/2007</duedate>
    <end/><duration>15</duration>
    <complete/>
    <day id="17" month="09" year="2007">
    <apresmidi>1</apresmidi>
    </day>
    <day id="20" month="09" year="2007">
    <matin>1</matin><apresmidi>1</apresmidi>
    </day>
    <day id="25" month="09" year="2007">
    <apresmidi>1</apresmidi>
    </day>
    <day id="27" month="09" year="2007">
    <matin>1</matin>
    </day>
    <day id="5" month="10" year="2007">
    <matin>1</matin><apresmidi>1</apresmidi>
    </day>
    </task>
    </tasks>
    Lorsque j'essaie d'appliquer votre code à ce xml, cela ne fonctionne pas.
    Alors peut être m'y suis je mal pris.
    Le code que j'avais posté au départ me permet d'afficher toutes les dates comprises entre la date de la balise <start> et la date du jour.
    Je vais essayer de modifier mes mktime dans mon code d'origine, mais je me permets de continuer à vous demander un coup de main...

    Merci d'avance.

    PS: j'avais oublié de préciser que je suis débutant en PHP... Mais vous avez du vous en douter^^

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Je n'avais pas compris le lien avec votre fichier XML. Vous demandiez plutôt, si j'ai bien compris cette fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
    function date2timestamp($date) {
        if (preg_match('~^(\d{2})([-/])(\d{2})\2(\d{4})$~', $date, $m) && checkdate($m[3], $m[1], $m[4])) {
            return mktime(0, 0, 0, $m[3], $m[1], $m[4]);
        } else if (preg_match('~^(\d{4})([-/])(\d{2})\2(\d{2})$~', $date, $m) && checkdate($m[3], $m[4], $m[1])) {
            return mktime(0, 0, 0, $m[3], $m[4], $m[1]);
        } else {
            die("Problème sur une date : $date");
        }
    }
     
    function lister_dates($deb, $fin) {
        $tDeb = date2timestamp($deb);
        $tFin = date2timestamp($fin);
     
        $res = array();
        while ($tDeb < $tFin) {
            $tDeb += 86400;
            if (date('N', $tDeb) < 6) { /* Requiert PHP 5.1.0 ou + */
                array_push($res, date('d/m/Y', $tDeb));
            }
        }
        return $res;
    }
     
    header('Content-type: text/plain');
    $sxml = simplexml_load_file('tasks.xml');
    foreach ($sxml->task as $t) {
        print_r(lister_dates($t->start, date('d/m/Y'))); /* On peut éventuellement optimiser sur le deuxième paramètre puisqu'il correspond à la date actuelle ... */
    }

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    C'est exactement ça!!!!!

    Je vous remercie sincèrement, ça faisait trois jours que je bloquais sur ce truc...


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/09/2011, 19h40
  2. Comparaison de dates dans Mysql
    Par inch dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2007, 12h08
  3. Requètes avec comparaison de date
    Par phoque.r dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/04/2007, 16h01
  4. Comparaisons de dates dans un SELECT
    Par lodan dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/10/2006, 14h26
  5. [XE] Comparaison de dates dans un Trigger
    Par Nicodemus dans le forum Oracle
    Réponses: 2
    Dernier message: 20/02/2006, 16h37

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