Timestamp et dates : interrogation [Résolu]

Signaler
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
-
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
-
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 :-)
A voir également:

9 réponses

Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
C'est bon j'ai pigé... : le changement d'heure...
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
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), '

';
?>
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
Félicitation :p
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
M'ci :-)
Ca m'a donné des sueurs froides...j'utilise ce petit code en production moi, sur un outil extranet important! lol...pffiou...
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
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
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
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 ?
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
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 !
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
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 :-)
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
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 :)