Menu

Problème de COMPARAISON ENTRE DEUX DATES [Résolu]

oncletom 34 Messages postés samedi 7 juillet 2007Date d'inscription 14 janvier 2018 Dernière intervention - 14 janv. 2018 à 09:13 - Dernière réponse : oncletom 34 Messages postés samedi 7 juillet 2007Date d'inscription 14 janvier 2018 Dernière intervention
- 14 janv. 2018 à 21:02
Bonjour à tous

Pour info, mon site est sur online et tourne sur PHP Version 5.5.9-1ubuntu4.22

Pour un site culturel qui annonce et commente des expositions, j'ai besoin d'une alerte quotidienne qui inscrive en tête de chaque article le nombre de jours restant pour pouvoir visiter l'exposition en question.

je ne suis pas un spécialiste du php, mais d'ordinaire je finis par trouver mes réponses en piochant des bouts de codes dans les forums et en travaillant par essais erreurs et corrections.
Mais ici rien à faire.

Le code retenu semble fonctionner mais me renvoie des réponses très fantaisistes.

Le voici

<?php
$DateEvenement = new DateTime('2018/02/13');
$DateNow = new DateTime();
$TempsRestant = $DateNow->diff($DateEvenement);
if($DateEvenement > $DateNow)
printf("Il reste %s jours pour voir l' exposition", $TempsRestant->d);
?>


L'ayant testé sur la date du 13 février 2018 j'étais assez satisfait de la réponse : 29 jours, sauf qu'en le testant sur d'autres dates j'ai du déchanter:
avec le 8 avril 2018 il répond 24 jours comme si il ne tenait pas compte du mois mais comptait les jours jusqu'a 31 et reprenait jusqu'au 8 .

Je pense avoir compris la faille mais je ne sais pas du tout comment y remédier



Pouvez-vous m'aider?

Merci d'avance


Afficher la suite 

6 réponses

Répondre au sujet
jordane45 20526 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 17 avril 2018 Dernière intervention - 14 janv. 2018 à 15:33
0
Utile
5
Bonjour,

   <?php
  
  //activation des erreurs PHP
  error_reporting(E_ALL);
  ini_set('display_errors', TRUE);
  ini_set('display_startup_errors', TRUE);
  
  function debug($var,$title=""){
    echo "<br><b>".$title."</b>";
    echo "<pre>";
    print_r($var);
    echo "</pre>";
  }
  
  $dateCible = '2018-04-08'; // ou 2018/02/13
  
  //exemple 1
  $dateNow1 = date('Y-m-d H:i:s');  
  debug($dateNow1,"dateNow1");
  
  $dateCible1 = date($dateCible);
  debug($dateCible1,"dateCible1");
  
  $nbDays1 = round(abs(strtotime($dateCible1) - strtotime($dateNow1))/86400);
  debug($nbDays1,"nbDays2");
  
  
  //exemple 2
  $dateNow2 = new DateTime();  
  debug($dateNow2,"dateNow2");
  
  $dateCible2 = new DateTime($dateCible);
  debug($dateCible2,"dateCible2");
  
  $interval = $dateNow2->diff($dateCible2);
  $nbDays2 = $interval->format('%a');
  debug($nbDays2,"nbDays2");

oncletom 34 Messages postés samedi 7 juillet 2007Date d'inscription 14 janvier 2018 Dernière intervention - 14 janv. 2018 à 18:14
Bonjour Jordane

C'est très gentil de m'avoir répondu si vite, il me reste un petit problème à régler, celui de la réponse conditionnelle. Dans mon code intitial - celui qui ne marchait pas...;) - je comparais les deux dates et n'affichais la réponse que si la date de fin d'expo était supérieure à la date de jour pour ne pas avoir de compte à rebours à l'envers ni de nb de jours négatif.

J'ai essayé ainsi en entrant volontairement une date dépassée le 5 janvier 2018 et en entrant une condition date cible supérieure à date jour mais ça ne marche pas : la réponse me dit que j'ai dix jours pour aller voir l'expo qui est terminée, alors que rien ne devrait s'afficher.

<?[/php/phpintro.php3 php]
$dateCible = '2018/01/05 '; // ou 2018/02/13  
  //exemple 1
  $dateNow1 = date('Y-m-d H:i:s');     
  $dateCible1 = date($dateCible);  
  $nbDays1 = round(abs(strtotime($dateCible1) - strtotime($dateNow1))/86400); 
if($dateCible> $DateNow)
  printf("Il reste %s jours pour voir l' [/contents/2142-l-exposition exposition]", $nbDays1);
?>


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).

Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
Jordane45


Et là je ne suis pas assez malin pour trouver ce qui ne va pas.
Alors il va me falloir encore un peu d'aide :(

Merci d'avance et très bonne soirée

Oncletom
jordane45 20526 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 17 avril 2018 Dernière intervention > oncletom 34 Messages postés samedi 7 juillet 2007Date d'inscription 14 janvier 2018 Dernière intervention - 14 janv. 2018 à 18:25
Pas une question d'être malin ou non... juste attentif.

Regarde le nom des variables et tu verras que tu as fait une petite erreur ( indice.. il manque un chiffre aux noms de tes variables dans ton if... )
oncletom 34 Messages postés samedi 7 juillet 2007Date d'inscription 14 janvier 2018 Dernière intervention - 14 janv. 2018 à 18:58
Merci pour les codes couleur, je n'avais pas remarqué l'icône.

J'ai changé ma condition par
if($dateCible1> $DateNow1)
  printf("Il reste %s jours pour voir  cette exposition", $nbDays1);


mais cela ne change rien, il me dit toujours que j'ai 10 jours pour voir l'exposition terminée

(j'ai aussi remplacé l'exposition par cette exposition, comme cela l'apostrophe n'est plus un problème)

Désolé mais je ne trouve pas. (honte à moi)
jordane45 20526 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 17 avril 2018 Dernière intervention - 14 janv. 2018 à 20:11
Déjà attention à l'écriture des variables...
Il faut respecter les majuscules / minuscules de noms des variables
Il ne faut pas non plus des espaces en trop dans le contenu de tes variables.

Pour finir... préfère TOUJOURS le format de date utilisant des tirets et non des slash.

Et sinon :
  //activation des erreurs PHP
  error_reporting(E_ALL);
  ini_set('display_errors', TRUE);
  ini_set('display_startup_errors', TRUE);
  
  function debug($var,$title=""){
    echo "<br><b>".$title."</b>";
    echo "<pre>";
    print_r($var);
    echo "</pre>";
  }
  
  $dateCible = '2018-01-05'; 
  
  //exemple 1
// Ne marche qu'avec le format  Y-m-d
  $dateNow1 = date('Y-m-d H:i:s');  
  debug($dateNow1,"dateNow1");
  
  $dateCible1 = date($dateCible);
  debug($dateCible1,"dateCible1");
  
  $nbDays1 = round(abs(strtotime($dateCible1) - strtotime($dateNow1))/86400);
  debug($nbDays1,"nbDays2");
  
  if($dateCible1 > $dateNow1) {
    printf("Il reste %s jours pour voir ' l'exposition", $nbDays1);
  }
  
  //exemple 2
  //ici $dateCible fonctionne avec le format Y/m/d ou Y-m-d
  $dateNow2 = new DateTime();  
  debug($dateNow2,"dateNow2");
  
  $dateCible2 = new DateTime($dateCible);
  debug($dateCible2,"dateCible2");
  
  $interval = $dateNow2->diff($dateCible2);
  $nbDays2 = $interval->format('%s');
  debug($nbDays2,"nbDays2");
  
  if($dateCible2 > $dateNow2) {
    printf("Il reste %s jours pour voir l'exposition", $nbDays2);
  }

?>
oncletom 34 Messages postés samedi 7 juillet 2007Date d'inscription 14 janvier 2018 Dernière intervention - 14 janv. 2018 à 21:02
Super. Merci beaucoup.
Commenter la réponse de jordane45