Jump to content

Ajouter 5 jours ouvrés en PHP casse tête


Recommended Posts

Bonjour,

 

J'ai fais ce script mais il ne me renvoi pas ce que j'ai besoin... une idée ?

Il ne saute pas les week end ..

//Ajoute 3 working days	 
$wd=1;
$i=1;
while ($wd != 3) {
 		$date_mk= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
 	 	
 	 	if( (date("N",$date_mk)!=6) OR (date("N",$date_mk)!=7)  )
    $wd++;
    
    $i++;
}
	  $date_mk= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	  
//Ajoute 5 working days	  
$wd=1;
$i=1;
while ($wd != 5) {
 		$date_mk2= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
 	 	if( (date("N",$date_mk)!=6) OR (date("N",$date_mk)!=7)  )
    $wd++;
    
    $i++;
}

	  $date_mk2= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	
		
		$date_exp = utf8_encode(strftime("%A %d %B",$date_mk));
		$date_exp2 = utf8_encode(strftime("%A %d %B",$date_mk2));
		
		$this->context->smarty->assign('expedition_date1',$date_exp);
		$this->context->smarty->assign('expedition_date2',$date_exp2);
Link to comment
Share on other sites

Bonjour,

remplacez les OR par des AND dans

 

if( (date("N",$date_mk)!=6) OR (date("N",$date_mk)!=7) )

if( (date("N",$date_mk)!=6) AND (date("N",$date_mk)!=7) )

 

j'ai testé avec le code ci-dessous qui affiche le résultat pour les 7 prochains jours :

 

 

<?php
 function add_working_days($nb_days, $date_start) {
  $wd=1;
  $i=1;
  while ($wd != $nb_days) {
   $date_mk= $date_start +(86400 * $i);
   if( (date("N",$date_mk)!=6) and (date("N",$date_mk)!=7)  ) {$wd++;}
   $i++;
  }
  return $date_start +(86400 * $i);
 }

 for ($d=0; $d<8; $d++) {
  $date_cmd =  mktime(0, 0, 0, date("m") , date("d")+$d, date("y"));
  $date_mk=add_working_days(3,$date_cmd);
  echo date('c', $date_cmd).' '.date('c', $date_mk)."<br>";
 }
?>

Cordialement.

Daniel Schoorens

Edited by dschoorens (see edit history)
Link to comment
Share on other sites

Non. Si vous mettez un OR, vous aurez ceci, transposé en français:

 

- Si le jour est différent de 6 ou différent de 7. Or, 6 étant différent de 7, vous tomberez toujours dans votre si.

 

Vous devez donc mettre un AND, car vous voulez savoir si le jour n'est ni un samedi ni un dimanche.

 

Ceci dit, je partirais sur ceci, personnellement: http://codes-sources.commentcamarche.net/source/47518-calcul-simple-du-nombre-de-jours-ouvres-entre-deux-dates-jours-feries-integres

 

Ainsi, vous prenez également en compte les jours fériés.

Link to comment
Share on other sites

Assez simplement, il tente d'ajouter x jours ouvrés en partant d'une date. Seulement en se basant sur l'exclusion du week-end.

 

Et je peux donner ceci, par rapport aux noms de variables pour ce que j'en comprends:

 

- $wd = $week_day = jour de la semaine

- $i = iteration

- $nb_days = Nombre de jours à rajouter 

- $date_start = Date de démarrage

- $date_mk = Date via mk_time()

- $date_exp1 = Date d'expedition (minimum)

- $date_exp2 = Date d'expedition (maximum).

 

Et donc, on démarre d'une date donnée, on souhaite afficher une première date à 3jours ouvrés et une seconde date à 5jours ouvrés correspondant à la date prévue d'expédition.

 

Voilà, complément d'informations sur ce que j'en comprends, donc.

  • Like 1
Link to comment
Share on other sites

Bonjour,

 

Il faut appliquer une des règles de Morgan (logique de Boole) qui dit que

ni (samedi ou dimahche) = ni samedi et ni dimanche

 

vous aviez écrit (ni samedi) ou (ni dimanche)  

Votre résultat est toujours vrai car si on est samedi, la condition ni dimanche est remplie et inversement. 

 

Avez vous testé le bout de code que j'avais posté en premier et testé ?

 

Cordialement.

Daniel.

Link to comment
Share on other sites

C'était mon OPCache PHP qui était trop efficace...

 

Ca marche merci... mais j'ai ajouté pas mal de fonction au code.. le code n'est pas très beau, mais je l'ai codé rapidement hier soir avec les pieds :

 

Si cela peut aider les dev ! Share

 if((int)self::$cookie->id_lang==2){
setlocale(LC_TIME, "fr_FR");
}
elseif((int)self::$cookie->id_lang==1){
setlocale(LC_TIME, "en_EN");
}
elseif((int)self::$cookie->id_lang==4){
setlocale(LC_TIME, "de_DE");
}
elseif((int)self::$cookie->id_lang==5){
setlocale(LC_TIME, "es_ES");
}

// Ajoute 3 working day
$i=1;
if(date("G")>16 and date("N")==5)
$wd=-1;
elseif(date("G")>16)
$wd=0;
elseif( date("N")==6)
$wd=0;
else
$wd=1;



while ($wd != 3) {
 		$date_mk= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
 		
 	 	if( (date("N",$date_mk)!=6) AND (date("N",$date_mk)!=7)  ){
    $wd++;
    }
    
    $i++;
}

	  
	  $date_mk= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	  if(date("N",$date_mk)==6){
	  $i=$i+2;
	  $date_mk= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	  }
	  elseif(date("N",$date_mk)==7){
	  $i=$i+1;
	  $date_mk= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	  }
	  
//Ajoute 5 working days	  
$i=1;
if(date("G")>16 and date("N")==5)
$wd=-1;
elseif(date("G")>16)
$wd=0;
elseif( date("N")==6)
$wd=0;
else
$wd=1;
while ($wd != 5) {
 		$date_mk2= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
 		
 	 	if( (date("N",$date_mk2)!=6) AND (date("N",$date_mk2)!=7)  ){
    $wd++;
    }
    
    $i++;
}
		

	  $date_mk2= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	  if(date("N",$date_mk2)==6){
	  $i=$i+2;
	  $date_mk2= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	  }
	  elseif(date("N",$date_mk2)==7){
	  $i=$i+1;
	  $date_mk2= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	  }
		
	
	//Ajoute 2 working days	  
$i=1;
if(date("G")>16 and date("N")==5)
$wd=-1;
elseif(date("G")>16)
$wd=0;
elseif( date("N")==6)
$wd=0;
else
$wd=1;
while ($wd != 2) {
 		$date_mk_48= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
 		
 	 	if( (date("N",$date_mk_48)!=6) AND (date("N",$date_mk_48)!=7)  ){
    $wd++;
    }
    
    $i++;
}


	  $date_mk_48= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	  if(date("N",$date_mk_48)==6){
	  $i=$i+2;
	  $date_mk_48= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	  }
	  elseif(date("N",$date_mk_48)==7){
	  $i=$i+1;
	  $date_mk_48= mktime(0, 0, 0, date("m") , date("d")+$i, date("y"));
	  }
	  

 		//Sending day
  if( (date("N")==6) )
    $date_mk_send= mktime(0, 0, 0, date("m") , date("d")+2, date("y"));
  elseif( (date("N")==7) )
  	$date_mk_send= mktime(0, 0, 0, date("m") , date("d")+1, date("y"));
  elseif((date(G)>16))
  	$date_mk_send= mktime(0, 0, 0, date("m") , date("d")+1, date("y"));
  else
 	 $date_mk_send= mktime(0, 0, 0, date("m") , date("d"), date("y"));
	
		$date_exp = utf8_encode(strftime("%A %d %B",$date_mk));
		$date_exp2 = utf8_encode(strftime("%A %d %B",$date_mk2));
		$date_exp_48 = utf8_encode(strftime("%A %d %B",$date_mk_48));
		$date_mk_send = utf8_encode(strftime("%A %d %B",$date_mk_send));
		
		$this->context->smarty->assign('expedition_date1',$date_exp);
		$this->context->smarty->assign('expedition_date2',$date_exp2);
		$this->context->smarty->assign('expedition_date_48',$date_exp_48);
		$this->context->smarty->assign('expedition_delivery',$date_mk_send);
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...