Timestamp et dates : interrogation

Résolu
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 28 sept. 2006 à 11:16
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 - 29 sept. 2006 à 22:29
Hello,

là, les gars, si quelqu'un a une explication, elle est la bienvenue :

<?php
/**
* function getDatesBetween
* renvoie un tableau contenant toutes les dates, jour par jour,
* comprises entre les deux dates passées en paramètre.
* NB : les dates doivent être au format aaaa-mm-dd (mais on peut changer le parsing)
* @param (string) $dStart : date de départ
* @param (string) $dEnd : date de fin
* @return (array) aDates : tableau des dates si succès
* @return (bool) false : si échec
*/
function getDatesBetween ($dStart, $dEnd) {
 $iStart = strtotime ($dStart);
 $iEnd = strtotime ($dEnd); if (false $iStart || false $iEnd) {
  return false;
 }
 $aStart = explode ('-', $dStart);
 $aEnd = explode ('-', $dEnd);
 if (count ($aStart) !== 3 || count ($aEnd) !== 3) {
  return false;
 } if (false checkdate ($aStart[1], $aStart[2], $aStart[0]) || false checkdate ($aEnd[1], $aEnd[2], $aEnd[0]) || $iEnd <= $iStart) {
  return false;
 }
 for ($i = $iStart; $i < $iEnd + 86400; $i += 86400 ) {
  $sDateToArr = strftime ('%Y-%m-%d', $i);
  echo $i, ' => ', $sDateToArr, '
';
  $sYear = substr ($sDateToArr, 0, 4);
  $sMonth = substr ($sDateToArr, 5, 2);
  $aDates[$sYear][$sMonth][] = $sDateToArr;
 }
 if (isset ($aDates) && !empty ($aDates)) {
  return $aDates;
 } else {
  return false;
 }
}




$aDates = getDatesBetween ('2006-09-01', '2006-10-31');
echo '', print_r ($aDates), '

';


echo date ('Y-m-d', 1162159200), '
';
echo date ('Y-m-d', 1162072800), '
';
echo  1162159200 - 1162072800, '
';
echo strtotime ('20061029 00:00:00'), '
';
echo strtotime ('20061030 00:00:00'), '
';
echo 1162162800 - 1162072800;
?>

matez, dans l'affichage du tableau, la date du 29 octobre 2006.
Puis analysez mes tests après le print_r ()...
24h correspondent à 86400 secondes.
Entre le 29 octobre et le 30 octobre 2006, il y a 90000 secondes...why??? Décalage pour simuler quoi, au juste ?

Merci :-)

9 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 sept. 2006 à 11:19
C'est bon j'ai pigé... : le changement d'heure...
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 sept. 2006 à 11:48
Code corrigé :

<?php
/**
* function getDatesBetween
* renvoie un tableau contenant toutes les dates, jour par jour,
* comprises entre les deux dates passées en paramètre.
* NB : les dates doivent être au format aaaa-mm-dd (mais on peut changer le parsing)
* @param (string) $dStart : date de départ
* @param (string) $dEnd : date de fin
* @return (array) aDates : tableau des dates si succès
* @return (bool) false : si échec
*/
function getDatesBetween ($dStart, $dEnd) {
 $iStart = strtotime ($dStart);
 $iEnd = strtotime ($dEnd); if (false $iStart || false $iEnd) {
  return false;
 }
 $aStart = explode ('-', $dStart);
 $aEnd = explode ('-', $dEnd);
 if (count ($aStart) !== 3 || count ($aEnd) !== 3) {
  return false;
 } if (false checkdate ($aStart[1], $aStart[2], $aStart[0]) || false checkdate ($aEnd[1], $aEnd[2], $aEnd[0]) || $iEnd <= $iStart) {
  return false;
 } for ($i $iStart; $i < $iEnd + 86400; $i strtotime ('+1 day', $i) ) {
  $sDateToArr = strftime ('%Y-%m-%d', $i);
  $sYear = substr ($sDateToArr, 0, 4);
  $sMonth = substr ($sDateToArr, 5, 2);
  $aDates[$sYear][$sMonth][] = $sDateToArr;
 }
 if (isset ($aDates) && !empty ($aDates)) {
  return $aDates;
 } else {
  return false;
 }
}




$aDates = getDatesBetween ('2006-09-01', '2006-10-31');
echo '', print_r ($aDates), '

';
?>
3
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
29 sept. 2006 à 20:46
Félicitation :p
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 sept. 2006 à 20:59
M'ci :-)
Ca m'a donné des sueurs froides...j'utilise ce petit code en production moi, sur un outil extranet important! lol...pffiou...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
29 sept. 2006 à 21:30
Mais tu utilises toujours pas les exceptions au lieu de faire du "return false" sans arrêt ?

Pourtant, c'est beaucoup plus facile à gérer je trouve au niveau des erreurs... un si beau code PHP5 quand même :p
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 sept. 2006 à 21:39
Pour être franc avec toi, je n'ai pas encore pleinement exploré les exceptions. Du coup, je ne suis pas super à l'aise avec. Et j'ai tellement l'habitude de gérer avec les false...lol.
Tien...si t'as le temps, donne moi un exemple de ce que tu ferais à ce niveau avec ce code ?
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
29 sept. 2006 à 21:53
En gardant la classe d'exception tel quel :

function getDatesBetween ($dStart, $dEnd) {
 $iStart = strtotime ($dStart);
 $iEnd = strtotime ($dEnd); if (false $iStart || false $iEnd) {
   throw new Exception('Erreur de création de timestamp pour $dStart ou $dEnd');
 }

 $aStart = explode ('-', $dStart);
 $aEnd = explode ('-', $dEnd);
 if (count ($aStart) !== 3 || count ($aEnd) !== 3) {
  throw new Exception('Erreur lors du décompte jj-mm-yyyy'); // même si je doute que tu ais besoin d'un contrôle ici :o
 }
 if
(false checkdate ($aStart[1], $aStart[2], $aStart[0]) || false
checkdate ($aEnd[1], $aEnd[2], $aEnd[0]) || $iEnd <= $iStart) {
  throw new Exception('Erreur lors de la vérification des dates de début et de fin');
 } for ($i $iStart; $i < $iEnd + 86400; $i strtotime ('+1 day', $i) ) {
  $sDateToArr = strftime ('%Y-%m-%d', $i);
  $sYear = substr ($sDateToArr, 0, 4);
  $sMonth = substr ($sDateToArr, 5, 2);
  $aDates[$sYear][$sMonth][] = $sDateToArr;
 }
 if (isset ($aDates) && !empty ($aDates)) {
  return $aDates;
 } else {
  return false;
 }
}

try { if ( false !($aDates getDatesBetween ('2006-09-01', '2006-10-31') ) {
      echo '', print_r ($aDates), '

';
 } else {
     echo 'Aucune date possible entre les 2 dates séléctionnées';
 }
} catch ( Exception $e ) { // La on rentre dans le cas où le gars s'est planté dans une des dates que tu rentres en arguments de fonctions.
   echo $e->getMessage();
}

Comme ca, tu gères tes erreurs dans le catch(), et la bonne exécution de ton code dans le try().
Bon à savoir, try{}catch{} peut s'empiler. Ex :
try {
  functionx();
   try {
     functiony();
  } catch ( Exception $e1 ) {
     die ($e1->getMessage());
 }
} catch ( Exception $e2 ) {
 die ($e2->getMessage());
}

Je trouve ca beaucoup plus puissant que de faire du "return false" à tout va. Mais tu peux par exemple éviter de voir les messages d'erreurs dans ta fonction. Suffit de dériver la classe d'exception :

class exc_extended extends exception {

 public function __construct($code_err) {
  require_once('./fichier_avec_les_codes_et_les_msg_d'erreur.php');
   parent::__construct($tableau[$code_err], $code_err);
 }

}

Ce qui donne dans tes fonctions :
function x {
 if ( $x === null ) {
     throw new Exception(1);
 }
}

try {
  x();
} catch ( Exception $e ) {
   die ( $e->getMessage() );
}

Et ca ira chercher le message d'erreur tout seul dans un fichier à part. Surtout si tu fais du multilangage, la gestion des exceptions peut se révéler très puissante par sa modularité :)
Vala vala !
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 sept. 2006 à 22:23
Je ne fais pas de multilangage sur notre extranet (pas encore...lol). Par contre, les erreurs et exceptions y sont gérés par ma classe de debugger (qui marche très bien d'ailleurs XD). Donc, c'est une très bonne idée! Même si y a jamais d'erreurs sur cette fonction vu que c'est moi qui l'utilise et que le code l'utilisant est bien fait ;-) Néanmoins, ton truc me permet effectivement de gérer les éventuelles erreurs de code qui ne créent pas d'erreurs internes PHP quelle qu'elle soit.
Donc, je vais adopter!

Merci :-)
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
29 sept. 2006 à 22:29
Tu peux aussi l'utiliser pour de la gestion de modules.
Imagine un truc comme ca :

Je fais un système de news ainsi qu'un système de commentaires.
Si la news est bonne, (disons que l'ID est existante en DB) on affiche les commentaires etc... J'ai 2 classes, une pour les news, l'autre les commentaires. Pour mettre tout ca en relation facilement, ca va donner quelque chose comme ca :

try {
  $n = new news($news_id);
  // etc...
   try {
        $c = new comments($news_id);
       // etc...
  } catch ( Exception $e1 ) {
     // Erreur, soit pas de commentaire, soit le module de commentaire est desactivé temporairement.
  }
} catch ( Exception $e2 ) {
 // Soit l'id de news est invalide, soit tout le module de news est desactivé par l'admin.

}

Voila un autre exemple d'utilisation :)
0
Rejoignez-nous