Les dates php

emi -  
ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   -
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. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
     
    $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
    0
    1. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
       
      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);
      }
      0
    2. emi
       
      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
      0
    3. emi
       
      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?????????????
      0
  2. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
     
    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);
    }
    
    0
    1. emi
       
      tt a fait d accord avec toi mais essay cet dates
      :
      $date1 = "01/06/2010 09:00";
      $date2 = "20/06/2010 08:00"

      ;
      0
    2. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
       
      commente
      $date1 = $date1 + 24 * 3600;
      

      et c'est - $heures au lieu de +
      $diff = ($diff - ($nwe * 2 * 24 * 3600))/2 - $heures;
      
      0
    3. emi
       
      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
      0
    4. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
       
      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
      0
    5. emi
       
      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" ????????
      0