Skip to content

PHP – Comparer les dates (deux dates) – astuce très pratique

31 mai, 2009

Hi all,

Pendant le développement d’un site web dynamique j’ai bien galérer avec une tout petite partie de ce dernier. Le principe de cette partie était de créer un espace membre: dans cet espace chaque membre pourra vérifier l’état de son abonnement (un abonnement payant) et la vérification devra être fait automatiquement, c’est a dire dès qu’un membre se connecte sur son espace, un script php doit faire la comparaison entre la date du jour et la date de fin de l’abonnement et afficher une image et un texte selon l’état de l’abonnement. Mais le seul problème qui m’a rencontré était: Comment comparer les dates (deux dates) en php (date de commencement de l’abonnement et date de fin) pour savoir si un abonnement valide ou non?

C’était tout bête mais je n’ai pas fait attention au début :-)


Voilà la solution pour comparer deux dates en php si quelqu’un en aura besoin:

< ?php
//----------------------------------------------------------------
//Astuce trouvée sur http://blog.galerie-cesar.com
//----------------------------------------------------------------
	$datejour = date('d/m/Y');
	//la date du fin est stocké dans une base de données
        //on extracte la date du fin depuis la bdd et on la met dans une variable $datefin
	$datefin= $donnees['fin'];  

        //explode pour mettre la date du fin en format numerique: 12/05/2006  -> 12052006
	$dfin = explode("/", $datefin); 

        //explode pour mettre la date du jour en format numerique: 31/05/2009  -> 31052009
        $djour = explode("/", $datejour); 

        // concaténation pour inverser l'ordre: 12052006 -> 20060512
	$finab = $dfin[2].$dfin[1].$dfin[0];
        // concaténation pour inverser l'ordre: 31052009 -> 20090531
	$auj = $djour[2].$djour[1].$djour[0]; 

	// Ensuite il suffit de comparer les deux valeurs

	if ($auj>$finab)
	{
	//------Abonnement expiré;-------
	echo "abonnement expiré":
	}
	else
	{
	//-------Abonnement en cours-----
	echo "abonnement valide":
	}
?>

Voila donc ma façon de comparer deux dates en php.
Merci de laisser un commentaire si vous trouvez l’astuce utile :-)

Articles similaires:

  1. Pour php j’utilise les apostrophes ou les guillemets?

A propos de l'auteur

Jeune développeur web et expert en SEO. Actuellement à la tête de l'agence de développement des sites Internet Galerie César.

Commentaires

  1. TonTon juin 7, 2009

    Sans commentaire.. court,simple… bravo …ça faisait 2h que je cherchais…des truc tordus avec des include de class ça j’en ai trouvé !!….mais ton truc fallait y penser …encore bravo et merci.

  2. Oussama juin 7, 2009

    Merci pour votre commentaire :-)
    N’hésitez pas de mettre un lien vers cet article si ce dernier vous a aidé :-)

  3. bhr_zied juin 22, 2009

    Merci pour la comparaison c tr simple idée et pratique et j’ajoute un exemple pour chercher le nombre de jour entre deux dates:

    function NbJours($debut, $fin) {

    $tDeb = explode(« - », $debut);
    $tFin = explode(« - », $fin);

    $diff = mktime(0, 0, 0, $tFin[1], $tFin[2], $tFin[0]) –
    mktime(0, 0, 0, $tDeb[1], $tDeb[2], $tDeb[0]);

    return(($diff / 86400)+1);

    }

    // Comment apeler la fonction
    $Nombres_jours = NbJours(« 2000-10-20″, « 2000-10-22″);
    // Affiche 2
    echo $Nombres_jours;

    ?>

  4. Wallace juin 23, 2009

    Magnifique et simple! Merci beaucoup à toi Oussama, ta méthode m’aura aidé dans l’écriture de mon script PHP. Encore une fois merci et bravo!

  5. GuilleW juin 25, 2009

    Bonjour, en utilisant la POO :

    // date à tester :
    $now = date(‘Y-m-d’);
    $next = ’2050-01-01′

    // test
    $now = new DateTime( $now );
    $now = $now->format(‘Ymd’);
    $next = new DateTime( $next );
    $next = $next->format(‘Ymd’);

    if( $now < $next ) echo « next est dans le futur »;
    else echo « next est dans le passé »;

    La POO rend le code plus claire et lisible, parfois les commentaires ne sont même plus necessaire ! :)

    Salutation.

  6. GuilleW juin 25, 2009

    [edit]
    Désolé, j’ai oublié le ;
    $next = ‘2050-01-01′;

  7. lilizzy juillet 24, 2009

    Super Oussama! Très astucieux!! Merci beaucoup!

  8. Oussama juillet 24, 2009

    Merci :-)

  9. Laurent août 6, 2009

    Salut,
    Bien comme code, mais pourquoi ne pas utiliser simplement les dates déjà formatés

    $datejour= (« Ymd »);
    $datefutur = date(« 20500101″);

    if($datejour > $datefutur)
    {
    echo $datefutur.’ est dans le futur…;
    }else
    {
    echo $datefutur.’ est dans le passé…);
    }

    Bonne continuation

  10. Oussama août 6, 2009

    on est obligé de faire ça car ces dates devront être affiché. Donc soit on les inverse lors de la comparaison soit lors de l’affichage et personnellement je préfère faire ça lors de la comparaison et laisser l’affichage standard.

  11. Vassili novembre 17, 2009

    Un grand merci a toi, je n’ai jamais utilisé le temps sur php autrement qu’en tchat et pour enregistrer des dates d’inscriptions.
    Tu m’épargne des jours de recherche.

  12. kimjoa février 6, 2010

    je développes un calendrier pour le cms modx , ton système de comparaison ma bien aidé ! très ingénieux ! merci ;)

  13. smtjv mars 30, 2010

    Merci pour ce code c’est simple super !

  14. Longshot mars 31, 2010

    Eu je me demande si ce n’est pas plus simple de mettre le tout en timestamp et de soustraire l’un par l’autre. Si chiffre positif= date passée, et pour savoir de combien, refaire date(‘j’, monResultat) …

    ex. tester si le 24.04.2010 est passée

    $dateTest = mktime(0, 0, 0, 04, 24, 2010);
    $dateLimit = mktime(0, 0, 0, 03, 18, 2010);

    if ($dateTest – $dateLimit > 0)

  15. Longshot mars 31, 2010

    Sorry un soucis d’envoi :( sur mes messages précédents
    (je profite pour dire Bravo pour le diz de ce site, j aime bcp)

  16. Pascal avril 21, 2010

    Bravo, simple et efficace

  17. linux31 mai 13, 2010

    Merci et merci pour ce Tuto

  18. Ben mai 19, 2010

    Merci pour les infos.

    galéré pas galérer ;)

  19. Dilemme mai 28, 2010

    Géniale l’astuce ! :D

  20. modele masculin juin 21, 2010

    juste un petiot commentaire pour te dire que tu gagenrais a etre reconnu par tous !

  21. riadh juin 24, 2010

    Merci bien mon ami, c’est très très gentil de la part de vous.

  22. markov août 12, 2010

    Merci pr l’article
    si par exmple on a 3 séparateurs pour une variable de type TimeSTAMP dans la bdd
    $date_experi=’2013-08-12 15:54:42 ‘
    malheureusement ca marche pas la fonction explode
    Merci de me répondre

  23. Locations vacances novembre 17, 2010

    Si la date est stockée dans mysql, il peut être intéressant d’utiliser les fonctions add_date couplés à INTERVAL pour faire des calculs ou des comparaisons de dates…

  24. Locations vacance novembre 17, 2010

    Des fois, il est important de ne pas oublier Mysql et ses fonctions si les dates sont stockés en BDD, en effet, l’utilisation des fonctions add_date, et INTERVAL peuvent permettre de se passer des analyses et calculs en PHP…

  25. zekrak janvier 14, 2011

    salut,

    c’est pas très sérieux.
    pourquoi t’enquiquiner avec :
    $datejour = date(‘d/m/Y’);
    $djour = explode(« / », $datejour);

    alors qu’il suffit de faire (pour des date au format « 0000-00-00 00:00:00″ ) :
    $auj = date(‘Ymd’); // pas utile
    $finab = date(‘Ymd’, strtotime($donnees['fin']));

    du coup, tu simplifie en évitant quelques variables inutiles :
    $expire = $finab>date(‘Ymd’) ? ‘expiré’ : ‘valide’;

  26. zekrak janvier 14, 2011

    Salut,

    bon, bien sur que vous êtes sérieux :-)

    concernant ces comparaisons, il est possible de prendre en compte les heures en utilisant le timestamp (Unix) :
    echo var_dump( strtotime($date_fin_publication) > time() );

    la fonction time() retourne le timestamp de la date/heure du jour
    strtotime() retourne le timestamp de la date à tester et au format texte.

    bon code !

  27. jo' avril 4, 2011

    hello,

    je ne comprend pas.. dans mon script php lorsque je fais un « explode » d’une date tel que tu la montré, cela me retourne un array qui n’a qu’une seule « case » de cet manière :

    $datejour = date(‘d/m/Y’);
    $djour = explode(« / », $datejour);

    echo($djour[0]) donne « 2012-4-4″ soit une date au format date. En gros « l’explode » à mis $datejour dans $djour[0]

    Faut-il importer un fichier pour que la fonction « explode » fonctionne comme dans ton script?

    Merci!!

  28. khalid mai 25, 2011

    Salut ca remonte un peu mai comment pourrais je integrer tonc ode au mieu qui affiche un tableau demandant la selection d’une date et d’uen temperature..
    jaimerais kil demande lheure de debut et lheur de fin

    ___________________________________________
    <?php

    echo'Bienvenue!

    ‘;

    // on verifie que la température a été envoiyé

    if(isset($_POST['temp']))

    {

    // on verifie que les données soient des chiffres

    if(is_numeric($_POST['temp']))

    {

    date_default_timezone_set(‘UTC’);//on récupere la date

    $now = date(« dmY »);

    $date = $_POST['jour'].$_POST['mois'].$_POST['annee'];

    if($date < $now)// on compare les deux dates pour voir si elle est supérieur ou égale a la date d'aujourdhui

    {

    echo'La date n\’est pas correct!’;

    }

    else

    {

    try

    {

    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;

    $bdd = new PDO(‘mysql:host=localhost;dbname=client’, ‘root’, ‘root’, $pdo_options);//on enregistre la date et le temps

    $req = $bdd->prepare(‘INSERT INTO temperature(date, temp ) VALUE (:date, :temp)’);

    $req->execute(array(

    ‘temp’ => $_POST['temp'],

    ‘date’ => $_POST['annee'].’-’.$_POST['mois'].’-’.$_POST['jour']

    ));

    echo’Le ‘.$_POST['jour'].’/’.$_POST['mois'].’/’.$_POST['annee'].’ la température sera de ‘.$_POST['temp'].’°C’;

    $req->closeCursor();

    }

    catch(Exception $e)

    {

    die(‘Erreur : ‘.$e->getMessage());

    }

    }

    }

    else

    {

    echo’La température est incorrect!’;

    }

    }

    echo’

    Température (°C)

    Date (jj/mm/aaaa)

    ‘;

    for ($jour = 1; $jour <= 31; $jour++)

    {

    echo '’.$jour. »;

    }

    echo’

    Janvier

    Fevrier

    Mars

    Avril

    Mai

    Juin

    Juillet

    Aout

    Septembre

    Octobre

    Novembre

    Decembre

    ‘;

    for ($annee = 2011; $annee <= 2020; $annee++)

    {

    echo '’.$annee. »;

    }

    echo’

    ‘;

    ?>

    ——————————————————-
    Merci d’avance

  29. Mr. mai 26, 2011

    Magnifique, si ce code était une femme je lui demanderai la main sans hésiter…. Bravo et puis merci bien

  30. lrq3000 juin 15, 2011

    GuilleW a dit :
    « La POO rend le code plus claire et lisible, parfois les commentaires ne sont même plus necessaire ! »

    C’est quand même une bien belle connerie que vous venez de dire. L’orienté objet n’est pas la panacée de l’informatique, loin de là. Cela résoud des problème, mais en crée bien d’autres, et dire que les commentaires peuvent ne plus être nécessaires est une manque flagrant de jugeotte. Les commentaires sont TOUJOURS nécessaires, et il n’y en a jamais assez, quelque soit le niveau d’abstraction du langage.

    Et pour les problèmes de l’orienté objet, se référer à la problématique de la sémantique en Intelligence Artificielle et de la représentation des objets en classes et instances, et leurs relations (de laquelle théorie découle directement le paradigme orienté objet). Vous verrez qu’on ne peut absolument pas tout représenter avec ce paradigme, et des choses simples pour nous peuvent vite devenir TRES alambiqués, d’où la nécessité des commentaires !

  31. Otsu juillet 5, 2011

    Merci pour l’astuce ! Simple et efficace =)

  32. Mohamde juillet 24, 2011

    Salut,
    On peut compares des dates avec le timestamp de php, convertir tes dates « chaînées » (affichées) en timestamp avec la fonction strtotime().

  33. otmaneha août 23, 2011

    Bonjour à tous!

    J’ai une table qui contient des dates sous cette forme date(‘d-m-Y à H:i:s’), et je souhaite créer un script qui permet d’extraire de cette table les dates qui sont > a 30 min donc tester sur la date et surtout sur minute, est ce que quelqu’un peut m’aider ? merci

    • Benbox69 août 23, 2011

      Tu peux utiliser ceci dans tes requêtes SQL : WHERE date >= ’2010-04-02 15:28:22′
      tu n’a donc plus qu’a calculer la date buttoir.

  34. Andy août 23, 2011

    Merci pour ces scripts les gars, je pense que j’utiliserai la POO, c’est vrai que c’est lisible et simple à mettre en place.

  35. Benbox69 août 23, 2011

    Pour ma part j’utilise une technique 100 fois plus simple :

    soit $exp la date d’expiration de l’abonnement enregistrée dans la base de données

    if(strtotime($exp) > time()) {
    echo ‘L’abonnement a expiré.’;
    } else {
    echo ‘L’abonnement est valide’;
    }

    de plus l’opération strtotime($exp) – time() donne le nombre de seconde restante pour l’abonnement, on peut donc facilement en deduire des jours, heure, minutes…

  36. Phil octobre 5, 2011

    Sinon, voilà 2 petites fonctions qui permettent de comparer facilement 2 dates au format YYYY-DD-MM. Ca retourne TRUE ou FALSE.

    /*
    * Compare 2 dates au format YYYY-MM-DD en fonction du signe passé en string
    * Si la $Date2 = « today », compare avec la date d’aujourd’hui.
    */

    function compare2dates($Date1, $comparaison, $Date2) {

    // Crée les timestamps
    $TS_Date1 = creeTimeStamp($Date1);
    if ($Date2 == « today ») {
    $TS_Date2 = creeTimeStamp(date(‘Y-m-d’)); // au lieu de time() pour obtenir l’égalité
    } else {
    $TS_Date2 = creeTimeStamp($Date2);
    }

    // Compare les TimeStamps
    switch ($comparaison) {
    case « <":
    return ($TS_Date1 < $TS_Date2);
    break;
    case "<=":
    return ($TS_Date1 = »:
    return ($TS_Date1 >= $TS_Date2);
    break;
    case « > »:
    return ($TS_Date1 > $TS_Date2);
    break;
    }
    }

    /*
    * Crée un timestamp à partir d’une date YYYY-MM-DD.
    */

    function creeTimeStamp($Date) {
    $arrayDate = explode(« - », $Date);
    return mktime(0, 0, 0, $arrayDate[1], $arrayDate[2], $arrayDate[0]);
    }

  37. Dge-06 octobre 26, 2011

    Pratique et simple. j’en avais besoin. Ça va m’être d’une très grande utilité. :)

    Merci !

  38. lingtalfi novembre 8, 2011

    Pour une comparaison 2 dates en général, je pense qu’on peut utiliser le fait que php convertit automatiquement les string en nombres avant la comparaison, du coup, même pas besoin de traitement supplémentaire, il faut simplement penser à mettre l’année en premier quand on prend la date :

    Autrement dit dans l’exemple donné, on peut faire directement :
    $datejour = date(‘Y/m/d’);
    if ($datejour>$datefin) // admettons que date fin ait le format (‘Y/m/d’) également
    24 {
    25 //——Abonnement expiré;——-
    26 echo « abonnement expiré »:
    27 }
    28 else
    29 {
    30 //——-Abonnement en cours—–
    31 echo « abonnement valide »:
    32 }

Trackbacks

  1. News Slider - Défilement d'infos - en utilisant jQuery | Blog Galerie César

Ajouter un commentaire

Required

Required

Optionnel

A propos de ce blog

Blog Galerie César est un blog qui parle de tous ce qui tourne autour du développement web et ses différentes technique comme le XHTML, CSS, PHP, JQuery...
Le blog parle également des techniques de référencement et d'optimisation des sites pour les moteur de recherches (SEO) et dans quelques parties on parle aussi de la sécurité informatique et la sécurité des sites web.
Pour me contacter: contact (me at) galerie-cesar.com.

Recent Comments

@GalerieCesar

  • No public Twitter messages.

Astuce

Pour monétiser son blog, vendre des liens de texte est un bon moyen si on ne veut pas mettre trop de banniéres sur le blog. Mais, on devrait toujours faire attention que les pages référencées soient pertinentes.s

Si vous souhaitez vous orienter vers les métiers de l'informatique, n'hésitez pas à consulter JobiJoba qui regroupe toutes les offres d'emploi du secteur, vous pouvez chercher par techno : jQuery, Php, Java... Selon vos recherches d'emploi en informatique, vous obtenez des suggestions de postes.

Liens

Switch to our mobile site