Algo ou fonction découpage du temps

Résolu/Fermé
Super_carotte Messages postés 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 - 7 janv. 2014 à 11:34
Super_carotte Messages postés 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 - 8 janv. 2014 à 12:02
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.
A voir également:

5 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
7 janv. 2014 à 13:31
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
0
Super_carotte Messages postés 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 127
7 janv. 2014 à 14:13
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.
0
Super_carotte Messages postés 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 127
Modifié par Super_carotte le 7/01/2014 à 17:02
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>";

?>
0
Super_carotte Messages postés 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 127
7 janv. 2014 à 17:26
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'));
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Super_carotte Messages postés 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 127
8 janv. 2014 à 12:02
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>';
?>
0