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 🙂
Catégorie: Developpement web, PHP
Tags: astuce php, comparer dates, PHP.
58 commentaires
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.
Merci pour votre commentaire 🙂
N’hésitez pas de mettre un lien vers cet article si ce dernier vous a aidé 🙂
[…] un ancien article traitant la façon de comparer deux dates en php, voila un deuxième article concernant le développement […]
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;
?>
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!
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.
[edit]
Désolé, j’ai oublié le ;
$next = ‘2050-01-01′;
Super Oussama! Très astucieux!! Merci beaucoup!
Merci 🙂
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
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.
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.
je développes un calendrier pour le cms modx , ton système de comparaison ma bien aidé ! très ingénieux ! merci 😉
Merci pour ce code c’est simple super !
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)
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)
Bravo, simple et efficace
Merci et merci pour ce Tuto
Merci pour les infos.
galéré pas galérer 😉
Géniale l’astuce ! 😀
juste un petiot commentaire pour te dire que tu gagenrais a etre reconnu par tous !
Merci bien mon ami, c’est très très gentil de la part de vous.
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
On bricole un ptit peu l’explode, on ajoute un substr _replace pour enlever l’heure et bingo 🙂
Voilà ce que ça donne:
< ?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= "2013-08-12 15:54:42"; //explode pour mettre la date du fin en format numerique: 12/05/2006 -> 12052006
$dfin = explode(« -« , $datefin);
$dfin[2] = substr_replace($dfin[2] , » »,-9);
//echo «
« .$dfin[2];
//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
echo « date fin: « ;
echo $finab = $dfin[0].$dfin[1].$dfin[2]. »
« ;
// concaténation pour inverser l’ordre: 31052009 -> 20090531
echo « date aujo: « ;
echo $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 »;
}
?>
Merci, bien utile ^^
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’;
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 !
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!!
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
Magnifique, si ce code était une femme je lui demanderai la main sans hésiter…. Bravo et puis merci bien
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 !
Merci pour l’astuce ! Simple et efficace =)
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().
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
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.
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.
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…
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]);
}
Pratique et simple. j’en avais besoin. Ça va m’être d’une très grande utilité. 🙂
Merci !
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 }
Merci, cela m’est bien utile pour comparer la date de mise en circulation d’une voiture, et la date du jour, et ainsi déterminer si mes clients peuvent financer leur achat sur le site de mon client. 🙂
Bravoo ! 🙂
Vraiment très pratique! Un grand merci car je ne trouvais pas l’astuce. Je tiens à te remercier vraiment ! D’habitude je ne poste pas pour dire merci, mais là… Bref. Merci !
Correction du code, et les autres asttuce du style strtotime ne marchent qu’avec certains format de date- Travailler avec la reconnaissance du slash comme Oussama le propose est la plus facile !
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";
}
?>
Merci beaucoup, l’astuce m’a permis de gagner beaucoup de temps et de soucis !!
Merci 😀
C’est vrai qu’avec le POO c’est encore plus simple, mais merci pour le post
Bonjour,
Sincèrement merci pour ce partage, cela m’a permis d’utiliser ton astuce en php pour un développement personnel d’un outil en php, avec tri et comparaison de date.
Cordialement, Renaud
Merci, cela fait plusieurs jours que je cherche une solution pour les dates, ca fonctionne pour moi aussi encore Merci.
Très intéressant post, j’aime bien votre style
Article très intéressant, continuer
Bravo, une article de qualité.
Merci pour ce très bon article !
Merci beaucoup pour votre article de qualité.
Excellent article. je vous remercie pour l’effort 🙂
Excellent article je vous en remercie
Excellent post !thanks
Merci pour votre article
Merci pour cette astuce. Cependant, pour simplifier le code et éviter les erreurs de formatage, je recommande d’utiliser les objets DateTime en PHP.