Algo ou fonction découpage du temps
Résolu
Super_carotte
Messages postés
1420
Date d'inscription
Statut
Membre
Dernière intervention
-
Super_carotte Messages postés 1420 Date d'inscription Statut Membre Dernière intervention -
Super_carotte Messages postés 1420 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous :),
J'ai un souci et j'espère que pourrez m'aider a réaliser un petit algo.
Je suis en train de réaliser un site web avec une BDD derrière.
J'ai une donnée source que je mets dans un tableau php pour la traiter.
Exemple de donnée source:
ID_program: 1
Debut: 2013-12-16 15:34:55
Fin: 2013-12-17 09:34:58
Conso_CPU: 3000
Les dates sont au format "Y-m-d h:i:s" (elle viennent d'une BDD mySQL)
J'ai donc ici un programme qui a tourné environ 18h sur 2 jours mais je pourrai aussi avoir des programmes qui tournent sur 5 jours.
Mon soucis est le suivant:
Il faut que je découpe cette donnée en heure par heure. Donc que je passe d'une seule ligne comme indiqué dans l'exemple à:
ID_program: 1
Debut: 2013-12-16 15:34:55
Fin: 2013-12-16 15:59:59
Conso_CPU: 100
---
ID_program: 1
Debut: 2013-12-16 16:00:00
Fin: 2013-12-16 16:59:59
Conso_CPU: 200
---
etc...
jusqu'à la dernière heure du dernier jour:
---
ID_program: 1
Debut: 2013-12-17 09:00:00
Fin: 2013-12-17 09:34:58
Conso_CPU: 80
Donc découper en heure par heure et avoir la conso CPU au prorata du temps.
Existe t'il selon vous un moyen simple (algo ou fonction php) permettant de faire ce découpage en heure par heure sachant que le programme peut tourner sur plusieurs jours?
Un très grand merci a vous,
Amicalement,
Benjamin.
J'ai un souci et j'espère que pourrez m'aider a réaliser un petit algo.
Je suis en train de réaliser un site web avec une BDD derrière.
J'ai une donnée source que je mets dans un tableau php pour la traiter.
Exemple de donnée source:
ID_program: 1
Debut: 2013-12-16 15:34:55
Fin: 2013-12-17 09:34:58
Conso_CPU: 3000
Les dates sont au format "Y-m-d h:i:s" (elle viennent d'une BDD mySQL)
J'ai donc ici un programme qui a tourné environ 18h sur 2 jours mais je pourrai aussi avoir des programmes qui tournent sur 5 jours.
Mon soucis est le suivant:
Il faut que je découpe cette donnée en heure par heure. Donc que je passe d'une seule ligne comme indiqué dans l'exemple à:
ID_program: 1
Debut: 2013-12-16 15:34:55
Fin: 2013-12-16 15:59:59
Conso_CPU: 100
---
ID_program: 1
Debut: 2013-12-16 16:00:00
Fin: 2013-12-16 16:59:59
Conso_CPU: 200
---
etc...
jusqu'à la dernière heure du dernier jour:
---
ID_program: 1
Debut: 2013-12-17 09:00:00
Fin: 2013-12-17 09:34:58
Conso_CPU: 80
Donc découper en heure par heure et avoir la conso CPU au prorata du temps.
Existe t'il selon vous un moyen simple (algo ou fonction php) permettant de faire ce découpage en heure par heure sachant que le programme peut tourner sur plusieurs jours?
Un très grand merci a vous,
Amicalement,
Benjamin.
A voir également:
- Algo ou fonction découpage du temps
- Fonction si ou - Guide
- Renommer plusieurs fichiers en même temps - Guide
- Temps pour soi iphone - Guide
- Combien de temps reste une story sur facebook - Guide
- Mode Concentration sur iPhone : pour ne pas être dérangé - Guide
5 réponses
Bonjour,
Plusieurs questions.
1) Est-ce que ton découpage ne concerne qu'un seul programme à la fois, ou est-ce que tu veux pouvoir récupérer en une seule requête des données découpées de plusieurs programmes ?
2) Comment peux-tu connaître l'utilisation CPU sur une tranche horaire, si tu n'as en base que l'utilisation CPU sur la durée totale d'exécution ?
Xavier
Plusieurs questions.
1) Est-ce que ton découpage ne concerne qu'un seul programme à la fois, ou est-ce que tu veux pouvoir récupérer en une seule requête des données découpées de plusieurs programmes ?
2) Comment peux-tu connaître l'utilisation CPU sur une tranche horaire, si tu n'as en base que l'utilisation CPU sur la durée totale d'exécution ?
Xavier
1- j'ai des dizaines de programmes et je pensai les traiter les uns apres les autres. Donc en recuperer un, le découper et enregistrer les nouvelles ligne dans une autre BDD.
Je pensai faire le découpage via du PHP, pas via une requete SQL sur une BDD.
2- En fait je sais que je perd de l'information en faisant ça mais il n'y a pas d'autre choix. Je recupere des données de plusieurs sources. Certaines m'envoient directement les infos heure par heure donc je suis bon pour l'analyse mais d'autres m'envoi une seule ligne comme indiqué dans l'exemple. Je linéarise donc cette information en utilisant le prorata temporis.
Je pensai faire le découpage via du PHP, pas via une requete SQL sur une BDD.
2- En fait je sais que je perd de l'information en faisant ça mais il n'y a pas d'autre choix. Je recupere des données de plusieurs sources. Certaines m'envoient directement les infos heure par heure donc je suis bon pour l'analyse mais d'autres m'envoi une seule ligne comme indiqué dans l'exemple. Je linéarise donc cette information en utilisant le prorata temporis.
J'ai une solution mais pas tres "belle" au niveau du code. Si quelqu'un trouve mieu, merci a lui :)
<?php
$date_start_heure = 15;
$date_start_minute = 59;
$date_start_seconde = 10;
$date_start_mois = 12;
$date_start_jour = 16;
$date_start_annee = 2013;
$date_end_heure = 21;
$date_end_minute = 12;
$date_end_seconde = 30;
$date_end_mois = 12;
$date_end_jour = 16;
$date_end_annee = 2013;
$date_start = mktime($date_start_heure, $date_start_minute, $date_start_seconde, $date_start_mois, $date_start_jour, $date_start_annee);
$date_start_heure++;
$fin_premiere_heure = mktime($date_start_heure, 00, 00, $date_start_mois, $date_start_jour, $date_start_annee);
$ecart_premiere_heure = $fin_premiere_heure - $date_start;
$date_end = mktime($date_end_heure, $date_end_minute, $date_end_seconde, $date_end_mois, $date_end_jour, $date_end_annee);
$debut_derniere_heure = mktime($date_end_heure, 00, 00, $date_end_mois, $date_end_jour, $date_end_annee);
$ecart_derniere_heure = $date_end - $debut_derniere_heure;
$date = date("d-m-Y");
$heure = date("H:i");
Print("Nous sommes le $date et il est $heure </br></br>");
echo "date_start= ".$date_start."</br>";
echo "fin_premiere_heure= ".$fin_premiere_heure."</br>";
echo "ecart_premiere_heure= ".$ecart_premiere_heure."</br>";
echo "</br></br></br>";
echo "date_end= ".$date_end."</br>";
echo "debut_derniere_heure= ".$debut_derniere_heure."</br>";
echo "ecart_derniere_heure= ".$ecart_derniere_heure."</br>";
$ecart_total = $date_end - $date_start;
echo "</br></br></br>";
echo "ecart_total= ".$ecart_total."</br>";
$ecart_total_moins_premiere_et_derniere_heure = $ecart_total - $ecart_premiere_heure - $ecart_derniere_heure;
echo "ecart_total_moins_premiere_et_derniere_heure= ".$ecart_total_moins_premiere_et_derniere_heure."</br>";
$nb_heure = $ecart_total_moins_premiere_et_derniere_heure / 3600 ;
echo "nombre d'heure= ".$nb_heure."</br>";
echo "</br></br></br>--------------------------------------</br>";
echo date("Y-m-d H:i:s", $date_start)."</br>";
if($nb_heure > 0){
$date_start += $ecart_premiere_heure;
echo date("Y-m-d H:i:s", $date_start-1)."</br></br>";
}
while($nb_heure > 0){
echo date("Y-m-d H:i:s", $date_start)."</br>";
$date_start += 3600;
echo date("Y-m-d H:i:s", $date_start-1)."</br></br>";
$nb_heure --;
}
echo date("Y-m-d H:i:s", $debut_derniere_heure)."</br>";
echo date("Y-m-d H:i:s", $date_end)."</br>";
echo "--------------------------------------</br></br></br>";
?>
Nouvelle solution:
$debut = '2013-12-16 15:34:55';
$fin = '2013-12-17 09:34:58';
$objDatefin = date_create($fin);
$objDate = date_create($debut);
do {
echo 'debut : ' . $objDate->format('Y-m-d H:i:s') . '<br/>';
$objDate = date_create($objDate->format('Y-m-d H') . ':59:59');
if ($objDate < $objDatefin) {
echo 'fin : ' . $objDate->format('Y-m-d H:i:s') . '<br/>';
}
else {
echo 'fin : ' . $fin . '<br/>';
break;
}
}
while ($objDate->modify('+1 seconde'));
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Nouvelle solution:
<?php
$debut = '2013-12-16 15:30:00';
$fin = '2013-12-16 18:30:00';
$cpu = 10800;
$objDatefin = date_create($fin);
$objDate = date_create($debut);
$tab_data = array();
$i=0;
do {
$tab_data[$i]['debut'] = $objDate->format('Y-m-d H:i:s');
// echo 'debut : ' . $objDate->format('Y-m-d H:i:s') . '<br/>';
$objDate = date_create($objDate->format('Y-m-d H') . ':59:59');
if ($objDate < $objDatefin) {
$tab_data[$i]['fin'] = $objDate->format('Y-m-d H:i:s');
// echo 'fin : ' . $objDate->format('Y-m-d H:i:s') . '<br/>';
}
else {
$tab_data[$i]['fin'] = $fin;
// echo 'fin : ' . $fin . '<br/>';
break;
}
$i++;
}
while ($objDate->modify('+1 seconde'));
//gestion du prorata
$timestamp_debut=strtotime($debut);
$timestamp_fin=strtotime($fin);
$dif_timestamp = $timestamp_fin - $timestamp_debut;
$i=0;
foreach($tab_data as $cle => $val){
$timestamp_val_debut=strtotime($val['debut']);
$timestamp_val_fin=strtotime($val['fin']);
$dif_val_timestamp = $timestamp_val_fin-$timestamp_val_debut;
if($i!=(sizeof($tab_data)-1)){
$dif_val_timestamp++;
}
$cpu_prorata = round($dif_val_timestamp*$cpu/$dif_timestamp,2);
$tab_data[$i]['cpu'] = $cpu_prorata;
$i++;
}
echo '<pre>';
print_r($tab_data);
echo '</pre>';
?>