Les dates php

salut :

je veux calculer la différence entre 2 dates en évitant les week end et les heurs de 20h de soir au 8h de matin

2 réponses

  1. $date1 = "04/06/2010 09:00";
    $date2 = "07/06/2010 23:00";

    $date1 = datetounixtime($date1);
    $heure1 = $date1['h'];
    $date1 = $date1['date'];
    $date2 = datetounixtime($date2);
    $heure2 = $date2['h'];
    $date2 = $date2['date'];

    //numero de semaine 1
    $w1 = date('W',$date1);

    //numero de semaine 2
    $w2 = date('W',$date2);

    $jsem1 = date('N',$date1);
    //si la premier jour est dans un week end,
    if($jsem1 == 6) //samedi
    {
    $decal1 = 0; //le décalage ne sert plus, c'est un week end
    $date1 += 2 * 24 * 3600; //on décale la date de 2 jours (le lundi)
    $w1 += 1;
    }

    if($jsem1 == 7) //dimanche
    {
    $decal1 = 0; //le décalage ne sert plus, c'est un week end
    $date1 += 1 * 24 * 3600; //on décale la date de 1 jour (le lundi)
    $w1 += 1;
    }

    $jsem2 = date('N',$date2);
    //si la premier jour est dans un week end,
    if($jsem2 == 6) //samedi
    {
    $decal1 = 8; //le décalage est mis à 8h, on décale au vendredi à 0h mais celui ci compte (il a 8h)
    $date2 -= 1 * 24 * 3600; //on décale la date de 2 jours (le vendredi)
    $w2 -= 1; //on enleve une semaine pour ne pas compter le we de cet semaine
    }

    if($jsem2 == 7) //dimanche
    {
    $decal2 = 16; //idem
    $date1 -= 2 * 24 * 3600; //on décale la date de 2 jour (le vendredi)
    $w2 -= 1;
    }
    if($jsem1 < 6)
    {

    //on compte toute la journée, on calcule combien d'heure faut enlever
    $decal1 = 12; //12h de 0h à 8h et 20hà 0h
    if($heure1 >= 8)
    $decal1 -= ($heure1 - 8);
    if($heure1 >= 20)
    $decal1 = 0; // on enlève les 12h restantes
    $heure1 = $decal1;
    $date1 = $date1 + 24 * 3600; //1ere journée etant calculé
    }
    if($jsem2 < 6)
    {

    $decal2 = $heure2;
    if($heure2 <= 8)
    $decal2 = 0;//on enlève les 8h du début de journée
    if($heure2 > 8)
    $decal2 = ($heure2 - 8);
    if($heure2 >= 20)
    $decal2 -= ($heure2 - 20);
    $heure2 = $decal2;
    //$date2 = $date2 - 24 * 3600; //derniere journée calculé
    }

    //le nombre de we
    $nwe = $w2 - $w1;

    //on a ici les temps unix avec le décalage

    $diff = $date2 - $date1;
    //les heures de 20h à 8h équivaut à enlever 12h par jour
    $heures = ($heure1 + $heure2) * 3600;
    $diff = $diff - ($nwe * 2 * 24 * 3600) + $heures;

    print $diff / 3600;

    J'ai 23 comme résultat, ce qui est correct, 11h le premier jour, 12h le 2e et un week end entre
    1. En fermant mes fichiers, j'ai vu qu'il manquait la fonction :

      function datetounixtime($date)
      {
      preg_match("/([0-9]{2}).([0-9]{2}).([0-9]{4}) ([0-9]{2}).([0-9]{2})/",$date,$matches);
      //date fr à date en
      $date = $matches[3].'-'.$matches[2].'-'.$matches[1];
      $heure = (int)$matches[4];
      $min = (int)$matches[5];
      //conversion en temps unix avec mise à 0 de l'heure pour les calculs
      $date = strtotime($date.' 00:00');
      return array('date'=>$date,'h'=>$heure,'m'=>$min);
      }
    2. merci Chris ca marche bien
      je peux laisser le choix à l utilisateur pour changer l heure de debut et de fin ca veut dire la période de 8h au 20h
    3. Chris pourqoi quand il s aigit de meme journée

      $date1 = "05/06/2010 09:00";
      $date2 = "05/06/2010 09:00";

      il revoie toujours 42?????????????
  2. Plus simplement :

    $date1 = "07/06/2010 09:00";
    $date2 = "08/06/2010 08:00";
    
    $date1 = datetounixtime($date1);
    $heure1 = $date1['h'];
    $date1 = $date1['date'];
    $date2 = datetounixtime($date2);
    $heure2 = $date2['h'];
    $date2 = $date2['date'];
    
    
    //numero de semaine 1
    $w1 = date('W',$date1);
    
    //numero de semaine 2
    $w2 = date('W',$date2);
    
    $jsem1 = date('N',$date1);
    //si la premier jour est dans un week end, 
    if($jsem1 >= 6) //samedi dimandhe
      $heure1 = 0;
      
    $jsem2 = date('N',$date2);
    //si la premier jour est dans un week end, 
    if($jsem2 >= 6) //samedi dimanche
      $heure2 = 0;
    
    if($jsem1 < 6)
    {
    	
    	//on compte toute la journée, on calcule combien d'heure faut enlever
    	$decal1 = 12; //12h de 0h à 8h et 20hà 0h
    	if($heure1 >= 8)
    	  $decal1 -= ($heure1 - 8);
    	if($heure1 >= 20)
    	  $decal1 = 0; // on enlève les 12h restantes
    	$heure1 = $decal1;
    	$date1 = $date1 + 24 * 3600; //1ere journée etant calculé
    }
    if($jsem2 < 6)
    {
    	
    	$decal2 = $heure2;
    	if($heure2 <= 8)
    	   $decal2 = 0;//on enlève les 8h du début de journée
    	if($heure2 > 8)
    	   $decal2 = ($heure2 - 8);
    	if($heure2 >= 20)
    	  $decal2 -= ($heure2 - 20);
    	$heure2 = $decal2;
    }
    
    
    //le nombre de we
    $nwe = $w2 - $w1;
    
    //on a ici les temps unix avec le d?calage
    
    $diff = $date2 - $date1;
    //les heures de 20h à 8h équivaut à enlever 12h par jour
    $heures = ($heure1 + $heure2) * 3600;
    $diff = ($diff - ($nwe * 2 * 24 * 3600))/2 + $heures;
    
    
    print $diff / 3600;
    
    function datetounixtime($date)
    {
      preg_match("/([0-9]{2}).([0-9]{2}).([0-9]{4}) ([0-9]{2}).([0-9]{2})/",$date,$matches);
      //date fr à date en
      $date = $matches[3].'-'.$matches[2].'-'.$matches[1];
      $heure = (int)$matches[4];
      $min = (int)$matches[5];
     //conversion en temps unix avec mise à 0 de l'heure pour les calculs
      $date = strtotime($date.' 00:00');
      return array('date'=>$date,'h'=>$heure,'m'=>$min);
    }
    
    1. tt a fait d accord avec toi mais essay cet dates
      :
      $date1 = "01/06/2010 09:00";
      $date2 = "20/06/2010 08:00"

      ;
    2. commente
      $date1 = $date1 + 24 * 3600;
      

      et c'est - $heures au lieu de +
      $diff = ($diff - ($nwe * 2 * 24 * 3600))/2 - $heures;
      
    3. Chris ca reste +$heurs pour obtenir la bonne resultat mais

      si on declare les dates
      $date1 = "01/06/2010 09:00";
      $date2 = "19/06/2010 08:00"

      on aura pas la meme resultat normalement ca doit rester 168 mais je trouve 156

      ca veut dire (168-12)=156

      merci beaucoup Chris pour tes reponses vraiment j ai besoin de ca
    4. c'est moins non parce que je prend en compte la journée entière (dc 8h) auxquels il faut enlever la différence entre 8h du matin et l'heure réel de début
    5. oui t as raison Chris
      comment je peux utiliser les date de la forme "2010/06/16" au lieu de la forme "16/06/2010" ????????