Page 1 sur 1

Clacul Dtae avec timestamp

Posté : 01 août 2013, 12:31
par Michel6359
Bonjour

Je recherche comment faire pour calculer une date avec x mois plus tard avec champ date timestamp et frequance int
J'ai un champ Datedecontrole et un champ fréquencedecontrole ( 3 à 48 ) donc je désire afficher la date du prochain contrôle donc datedecontrole + frequencecontrole = dateduprochaincontrole

Merci

Re: Clacul Dtae avec timestamp

Posté : 01 août 2013, 13:47
par Mazarini
Tu peux utiliser mktime (http://php.net/manual/fr/function.mktime.php) en utilisant $M+x comme mois, php gère automatique le décalage lorsque le nombre de mois dépasse 12. Attention cependant au changement d'heure (ajout ou retrait d'une heure ?) et au nombre de jours du mois (passage du 31 ou 1er). Tests à faire pour voir si c'est ok par rapport à ce que tu attends. Voir la fonction date() pour obtenir les paramètres de mktime().

Voir aussi date_ add().

Re: Clacul Dtae avec timestamp

Posté : 01 août 2013, 18:40
par Michel6359
Bonjour

J'ai essayé ça mais cela ne fonctionne pas
<?php
 $calcul = strtotime(+ .'$datas['frequence_controle'].' months",$datas['date_du_controle']);  
// ne fonctionne pas

// J'ai essayé ça aussi pas d'erreur mais cela m'affiche n'importe quoi , exemple contrôle le 03/07/2013 cela m'affiche pour une fréquence de 12 mois 13/08/2013 cela ne fais pas 12 mois ?

// Les frequences controle sont comprises entre 3 et 48 mois , la date_du_controle elle est saisie lors du contrôle
$calcul = time()+60*60*24*$datas['frequence_controle'];
$date_prochain_controle = $datas['date_du_controle']+ $calcul
?>
<td class="rouge"><?php echo date("d/m/Y",$date_prochain_controle); 
 ?></td>   


Merci

Re: Clacul Dtae avec timestamp

Posté : 02 août 2013, 09:57
par Mazarini
1) A priori, c'est month sans "s"

2) 60*60*24, c'est un nombre de jours pas de mois

3) Il n'y a pas de message d'erreur ?

Essayes un truc simple pour commencer :
<?php 
echo date("d/m/Y",strtotime('+1 month'),'<br>'; 
echo date("d/m/Y",strtotime('+3 month'),'<br>'; 
echo date("d/m/Y",strtotime('+6 month'),'<br>'; 
$datas['frequence_controle'] = 6;
$delta = '+'.$datas['frequence_controle'].' month';
echo $datas['frequence_controle'],'/',$delta,'/',date("d/m/Y",strtotime($delta),'<br>'; 

 ?>

Re: Clacul Dtae avec timestamp

Posté : 02 août 2013, 12:05
par Michel6359
Bonjour

OK merci je tiens au courant du résultat

Re: Clacul Dtae avec timestamp

Posté : 03 août 2013, 15:47
par Michel6359
Bonjour

J'ai reçu mon calcul encore quelques petit problème d'affichage mais je verrai après

ce code est il bon pour vous : Je désire afficher que mon matériels est en Alerte donc si la date du jour dépasse la date alerte alors on affiche "Alerte"


<?php  
   
   
	$date_controle = $datas['date_controle1'];
	$plus = $datas['frequence_controle'];
	$date_alerte = date('d/m/Y',strtotime("+$plus month", strtotime($date_controle))); 

 
?>  

<td class="rouge"><?php echo $date_alerte;
$datedujour = 'date("d/m/Y")';
	if ($datedujour > $date_alerte ) {
	echo ' Alerte ';
	}


?>
Après cette quand cela sera résolu , je vais faire en sorte que :

Que le champ état , passe de de 0 à 1 en base de données , 0 correspondant à conforme et 1 Non conforme du matériels puisque que la date du prochain contrôle sera supérieur à la date du jour et envoie d'email pour être avertis 30 jours avant et le jour j

merci pour votre aide

Re: Clacul Dtae avec timestamp

Posté : 03 août 2013, 16:02
par Michel6359
J'ai corrigé les ' ' dans date ci-dessus , mais les alerte ne se font pas correctement. Voir capture

 <?php  
   
   
	$date_controle = $datas['date_controle1'];
	$plus = $datas['frequence_controle'];
	$date_alerte = date('d/m/Y',strtotime("+$plus month", strtotime($date_controle))); 

 	

	
	//echo "$date<br>";
	//echo date('Y-m-d H:i:s',strtotime("+$plus hours", strtotime($date))) . '<br>';
 
?>  

<td class="rouge"><?php echo $date_alerte;
$datedujour =  date('d/m/Y') ;
	if ($datedujour < $date_alerte ) {
	echo ' Alerte ';
	echo  $datedujour ;
	}


?>

[img]

http://www.michel-techet.com/Ortec_Dunk ... apture.JPG


[/img]

Re: Clacul Dtae avec timestamp

Posté : 04 août 2013, 11:02
par xTG
Ton if est incorrect car ainsi PHP va analyser du texte, à savoir une comparaison des codes ascii.
Si tu veux mettre en place un if de ce genre tes dates doivent être sous le format : AAAAMMJJ pour que ce test soit correct.

Re: Clacul Dtae avec timestamp

Posté : 04 août 2013, 11:07
par Michel6359
Bonjour

Je ne vois pas comment faire j'ai déjà mis le format --> $datedujour = date('d/m/Y') ; et comme la date alerte est au même format si tu as vu la capture.

Merci

Re: Clacul Dtae avec timestamp

Posté : 04 août 2013, 12:31
par Michel6359
RE

Bon j'ai fais ceci et cela fonctionne
<?php  
   
   
	$date_controle = $datas['date_controle1'];
	$plus = $datas['frequence_controle'];
	$date_alerte_calcul = date('Y/m/d',strtotime("+$plus month", strtotime($date_controle))); 
    $date_alerte = date('d/m/Y',strtotime("+$plus month", strtotime($date_controle))); 

?>  

<td class="rouge"><?php echo $date_alerte;
$datedujour =  date('Y/m/d') ;
	if ($datedujour > $date_alerte_calcul ) {
	echo ' Alerte ';
	
	}
     
?>

Maintenant je voudrai faire en sorte d'être prévenu par email 30 jours avant la mise en alerte du matériels . une idée serait la bienvenue

Merci pour ton aide

Re: Clacul Dtae avec timestamp

Posté : 04 août 2013, 14:42
par moogli
salut,


pour le calcul de date les classes datetime et dateInterval te ferais le taff tous aussi simplement ;)
<?php
$intervall = new DateInterval('P'.$nbJour.'D');
$lastCtrl = new DateTime('la date au format que tu veux');
// ou avec la méthode DateTime::createFromFormat
$lastCtrl = DateTime::createFromFormat('le format qui correspond à ce que tu récupère', 'la date récupérée')
$prochain = $lastCtrl->add($intervall);
// affichage comme tu veux avec la méthode format
Simple et plus clair ;)

pour l'avertissement par email c'est pas beaucoup plus complexe, sauf que l'on va faire faire le calcul au sgbd et non à php.
cela va éviter de récupérer 5 millions de lignes qui n'on pas besoin de l'être.

tu selectionne les lignes qui ont (une date de dernier contrôle + durée entre controle) qui est comprise entre maintenant et (maintenant + 30 jours) (les parenthèses sotn ;a pour t'aider).

ensuite il te reste à boucler sur le résultat pour créer le corps du message (pourquoi pas avec un lien vers le détails de chaque matériel.

ensuite envoie avec la fonction mail ou en utilisant la classe phpmailer (demande à google pour plus d'info).


@+

Re: Clacul Dtae avec timestamp

Posté : 04 août 2013, 15:12
par Michel6359
Bonjour

Merci pour tes conseils , je dois encore regardé car là je reçois 53 emails pour 53 matériels non conforme , donc un peu chiant , lol

En plus il ne dit pas qu'elle matériels est non conforme dans mon email pourtant g mis les variables. je reçois :

Bonjour,

Notre système a détecté que le matériel sous le N° - non conforme.


 <?php  
   
   
	$date_controle = $datas['date_controle1'];
	$plus = $datas['frequence_controle'];
	$date_alerte_calcul = date('Y/m/d',strtotime("+$plus month", strtotime($date_controle))); 
    $date_alerte = date('d/m/Y',strtotime("+$plus month", strtotime($date_controle))); 

?>  

<td class="rouge"><?php echo $date_alerte;
$datedujour =  date('Y/m/d') ;
	if ($datedujour > $date_alerte_calcul ) {
	echo ' <img name="ok" src="images/alerte.gif" width="15" height="15" alt=""  /> ';
	
	/// Changement du statut en alerte ( Statut >> 0 ( Conforme) passe 1 ( Non conforme) //
	$id = $datas['id'];
	mysql_query("UPDATE materiels3 SET etat='1' WHERE id='$id' LIMIT 1");

	// Envoi du mail // 
	
	$id= $datas['id'];
	$materiels = $datas['designation'];
	$identification = $datas['reference'];
	mail($mail, $sujet2, $message2, $headers);
	}
	
	else {
		// Etat reste en 0 Conforme //
		$id = $datas['id'];
		mysql_query("UPDATE materiels3 SET etat='0' WHERE id='$id' LIMIT 1");
                                                                }
	
	
     
?>


Mon fichier mail.php

<?php

	$headers ='From: "Michel"<[email protected]>'."\n";
    $headers .='Reply-To: [email protected]'."\n";
    $headers .='Content-Type: text/html; charset="iso-8859-1"'."\n";
    $headers .='Content-Transfer-Encoding: 8bit';
	$mail = '[email protected]';
	$sujet2 = 'Notification de matériel en alerte';
	
	$matériels = $datas['designation'];
	$identification = $datas['reference'];
	
	$message2 = 'Bonjour,<br /><br />Notre système a détecté que le matériel '.$materiels.' sous le N°'.$id.' - '.$datas['designation'].'
	  non conforme.<br /><br />Cordialement,<br />Michel'."\r\n\r\n";
	  
	  
    ?>