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

Langage PHP Discussion :

Comparaison de date sans le jour


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut Comparaison de date sans le jour
    Bonjour,

    Savez-vous comment comparer 2 date uniquement par le mois et l'année en 2 chiffres ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $extract_date = preg_split("#[\/-]#", $operation['cpj_date']); # Exemple cpj_date => 12/02/16-11:02 
     
    if ((strtotime(date('m/y'))!=strtotime($extract_date[1]."/".$extract_date[2])) {
     
    ...
    Le code ci-dessus perd un peu les pédales d'une année à l'autre,
    merci d'avance pour votre réponse,

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2008
    Messages : 294
    Points : 333
    Points
    333
    Par défaut
    Bonjour,

    Tu devrais mettre un jour quand même, le même pour les deux dates.

  3. #3
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    Bonjour,
    Ceci te retournera le nombre de jours entre deux dates avec le signe plus ou moins (ne sachant pas tous les tests que tu veux faire ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	<?php
    	$operation['cpj_date']="12/02/16-11:02";
    	$extract_date = preg_split("#[\/-]#", $operation['cpj_date']); # Exemple cpj_date => 12/02/16-11:02 
    	$date = $extract_date[2]."-".$extract_date[1]."-".$extract_date[0];
    	$dateTest = date('y-m-d');
    	$datetime1 = date_create($date);
    	$datetime2 = date_create($dateTest);
    	$interval = date_diff($datetime1, $datetime2);
    	echo $interval->format('%R%a days');
    	?>
    cependant il est écrit dans la doc que l'on peut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $date1 = new DateTime("now");
    $date2 = new DateTime("tomorrow");
     
    var_dump($date1 == $date2);
    var_dump($date1 < $date2);
    var_dump($date1 > $date2);
    ?>
    L'exemple ci-dessus va afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool(false)
    bool(true)
    bool(false)
    Pourquoi faire simple quand on peut faire compliqué.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2008
    Messages : 294
    Points : 333
    Points
    333
    Par défaut
    Je viens juste de voir que tu as mis le mois puis l'année, essaye plutôt l'inverse année/mois.

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $x = '12/02/16-11:02';
    $y = '15/11/17-06:55';
     
    $dx = \DateTime::createFromFormat('d/m/y-H:i', $x);
    $dy = \DateTime::createFromFormat('d/m/y-H:i', $y);
     
    if (($dx !== false) && ($dy !== false))
    {
        $ymx = $dx->format('ym'); //year-month for date x
        $ymy = $dy->format('ym');
     
        $test = ($ymx <= $ymy);
    }

  6. #6
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Merci pour vos réponses mais aucune de vos explications ne fonctionnent,

    Nom : 1.jpg
Affichages : 80
Taille : 30,5 Ko

  7. #7
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    si tu peux poster ton code
    Pourquoi faire simple quand on peut faire compliqué.

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Est-ce que tu as essayé mon code tel quel avant de dire qu'il ne fonctionnait pas ?
    Par contre je pencherai plus du côté où t'es pas arrivé à le transposer à ton cas de figure.

    Comme le suggère très justement magicshark, poste ton code.

  9. #9
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    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
        $extract_date = preg_split("#[\/-]#", $operation['cpj_date']); # Exemple cpj_date => 12/02/16-11:02
    
       $date_compare = date('m/y', strtotime($operation['cpj_date']));   
           if ((date('m/y')!=$date_compare)&&($extract_date[2]!=$previous_month)) { # La barre de séparation mensuelle n'est pas affichée pour le mois en cours
             $previous_month = $extract_date[1];
       ?>
       <tr class="lstBxMonths">
        <td style="padding-left:47px" colspan="11"><?php echo $months[$previous_month]." ".$extract_date[2]; ?>
        </td>
       </tr>
       <?php
         
        }  
       ?>

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    ton code est incomplet...
    Il faudrait penser à trier les données lors de l'extraction SQL et s'assurer que le format de stockage des ces valeurs est bien DATETIME
    Poste le code complet.
    Dans tous les cas, on ne parse jamais une date à coup de preg_split(), il a une tonne de fonctions embarquées nativement par PHP pour faire ce travail.

  11. #11
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Bonjour,

    Merci pour la réponse,

    Le code précèdent correspond à la partie qui pose problème (en caractère gras dans le code),
    il y a 20000 lignes de code, le type champ est bien datetime,

    cordialement

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Voici une soluce :
    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
    $separator = function(\DateTime $date) use ($months)
    {
        echo <<<html
    <tr class="lstBxMonths">
        <td style="padding-left:47px" colspan="11">{$months[$date->format('n')]} {$date->format('Y')}</td>
    </tr>
    html;
    };
     
    $last = false;
    foreach ($data as $k => $operation)
    {
        $cpj_date = \DateTime::createFromFormat('d/m/y-H:i', $operation['cpj_date']);
     
        if ($cpj_date !== false)
        {
            if ($last === false)
            {
                if ((new \DateTime('now'))->format('ym') !== $cpj_date->format('ym'))
                {
                    $separator($cpj_date);
                }
            }
            elseif ($last->format('ym') !== $cpj_date->format('ym'))
            {
                $separator($cpj_date);
            }
     
            $last = clone $cpj_date;
     
            // ici tu affiches tes lignes de données
        }
    }
    N'oublie pas que tes données ($data) dans mon exemple doivent être ordonnées par date décroissante.

  13. #13
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    À tête reposé parfois on y voit plus clair...

    Pour que cela fonctionne, il faut que la requete retourne le format suivant "m/d/y"...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $query = mysql_query("SELECT cpj_id, DATE_FORMAT(cpj_date,'%m/%d/%y-%H:%i') AS cpj_date, ...
    Ensuite, il suffit très simplement d'utiliser la fonction date()

    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
     
           $previous_month=null;
           $month = date('m', strtotime($operation['cpj_date'])); // Nota ! Pour que cela fonctionne, il faut que la date réceptionné soit : "m/d/y"
           if ((date('m/Y')!=date('m/Y', strtotime($operation['cpj_date'])))&&($month!=$previous_month)) { # La barre de séparation mensuelle n'est pas affichée pour le mois en cours
             $previous_month = $month;
     
       ?>
       <tr class="lstBxMonths">
        <td style="padding-left:47px" colspan="11"><?php echo $months[$previous_month]." ".date('Y', strtotime($operation['cpj_date'])); ?>
        </td>
       </tr>
       <?php
     
        }  
       ?>
    Le résultat fonctionne parfaitement et la barre de séparation n'est pas affiché pour le mois en cours.

    Nom : 1.jpg
Affichages : 131
Taille : 31,4 Ko

    Remerciement,
    Bonne journée.

  14. #14
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Sinon, on peut aussi travailler avec la date au format YYYY-MM-DD, qui est le format ISO-chais-plus-quoi générique, beaucoup plus simple à manier (ça évite les problèmes existentiels du genre "est-ce que ma date '12/05/2016' c'est le 12 mai ou le 05 décembre déjà ?"), très bien accepté par les fonctions comme strtotime ou DateTime.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

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

Discussions similaires

  1. [XL-2007] Date sans mise à jour automatique
    Par EmmanuelleFFH dans le forum Excel
    Réponses: 4
    Dernier message: 20/07/2011, 12h07
  2. Parser une date sans depasser jours et mois
    Par zarohn dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 19/11/2010, 22h37
  3. Réponses: 7
    Dernier message: 12/01/2007, 12h09
  4. [Débutant][Date]Soustraction de jours et comparaisons
    Par Bloodscalp dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 31/10/2006, 16h11
  5. Réponses: 4
    Dernier message: 25/04/2006, 20h41

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