Les dates php

Fermé
emi - 1 juin 2010 à 15:48
ChrisCompote Messages postés 73 Date d'inscription mardi 8 juin 2010 Statut Membre Dernière intervention 19 juin 2010 - 18 juin 2010 à 09:42
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
A voir également:

2 réponses

ChrisCompote Messages postés 73 Date d'inscription mardi 8 juin 2010 Statut Membre Dernière intervention 19 juin 2010 8
8 juin 2010 à 22:37
$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
ChrisCompote Messages postés 73 Date d'inscription mardi 8 juin 2010 Statut Membre Dernière intervention 19 juin 2010 8
8 juin 2010 à 23:18
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
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
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
ChrisCompote Messages postés 73 Date d'inscription mardi 8 juin 2010 Statut Membre Dernière intervention 19 juin 2010 8
10 juin 2010 à 21:39
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
tt a fait d accord avec toi mais essay cet dates
:
$date1 = "01/06/2010 09:00";
$date2 = "20/06/2010 08:00"

;
0
ChrisCompote Messages postés 73 Date d'inscription mardi 8 juin 2010 Statut Membre Dernière intervention 19 juin 2010 8
11 juin 2010 à 13:16
commente
$date1 = $date1 + 24 * 3600;

et c'est - $heures au lieu de +
$diff = ($diff - ($nwe * 2 * 24 * 3600))/2 - $heures;
0
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
ChrisCompote Messages postés 73 Date d'inscription mardi 8 juin 2010 Statut Membre Dernière intervention 19 juin 2010 8
15 juin 2010 à 15:41
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
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