Problème de COMPARAISON ENTRE DEUX DATES

Résolu/Fermé
oncletom Messages postés 39 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 28 octobre 2021 - 14 janv. 2018 à 09:13
oncletom Messages postés 39 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 28 octobre 2021 - 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


1 réponse

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
14 janv. 2018 à 15:33
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");

0
oncletom Messages postés 39 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 28 octobre 2021 2
Modifié le 14 janv. 2018 à 18:26
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
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > oncletom Messages postés 39 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 28 octobre 2021
Modifié le 14 janv. 2018 à 18:27
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... )
0
oncletom Messages postés 39 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 28 octobre 2021 2
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)
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié le 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);
  }

?>
0
oncletom Messages postés 39 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 28 octobre 2021 2
14 janv. 2018 à 21:02
Super. Merci beaucoup.
0