Falsche Zeitberechnung??
juha
- perl
Hallo Zusammen
In einer wochenübersicht würde ich gerne Arbeitszeiten darstellen.
Normalerweise hat der Benutzer vier einträge (morgens gekommen, über den Mittag gegangen und wieder gekommen und abends wieder gegangen), aber es kann auch vorkommen dass sich der Benutzer öfters einträgt, z.B. Zahnarzttermin oder Therapie usw.
Der Benutzer ist frei wenn er kommen und gehen möchte, darum möchte ich individuel das Tagestotal berechnen können, ich wollte es wie folgt lösen, doch die berechnung gibt ein falsches Tagestotal aus!
(z.B. gekommen 07:42:16 gegangen 09:19:36, gekommen 09:27:29 gegangen 09:27:41 BERECHNUNG Tagestotal 15:10:16???)
Ich rechne bereits in Sekunden, hier der code!
#Tageszaehler
for($daycount=0;$daycount<=6;$daycount++)
{
$wochentag = show_wochentag($daycount);
#Liest alle Batcheinträge des angegebenen Tages ein (von der betroffenen Person)
$select = "select date_format(date_add('$wochenstart_datum', interval $daycount day),'%Y-%m-%d') as datum";
my($tmp) = $dbh->prepare($select);
$tmp->execute();
$hash_tmp = $tmp->fetchrow_hashref;
$tages_dat = $hash_tmp->{datum};
#Tagesname wird aus Unterfunktion gerufen und ausgegeben
$tagesname = show_tagname($daycount);
print "</tr>";
print "<td>$tag_name</td>";
#Batcheinträge anzeigen
my($sth) = $dbh->prepare("select * from batch where pers_id = $personen_id and batch_datum = '$tages_dat' order by batch_zeit");
$sth->execute();
$maxrow = 0;
while($hash_eintraege = $sth->fetchrow_hashref)
{
print "<td>$hash_eintraege->{batch_zeit}</td>";
$maxrow++;
if($maxrow%2 != 0)
{
($h,$m,$s) = split(/:/,$hash_eintraege->{batch_zeit});
$ein =0;
$ein = $h*3600+$m*60+$s;
}
else
{
($h,$m,$s) = split(/:/,$hash_eintraege->{batch_zeit});
$aus = 0;
$aus = $h*3600+$m*60+$s;
$diff = $diff+$aus-$ein;
}
$tag_total = $tag_total+$diff;
}
#Tagestotal berechnen und ausgeben
$stunde = "".int($tag_total/3600)."";
$minute = "".int(($tag_total-($stunde*3600))/60)."";
$sekunde = "".int(($tag_total-($stunde*3600)-($minute*60)))."";
$wochentotal += $tag_total;
$tag_total = 0;
zeitformat();
$zeit = "$stunde:$minute:$sekunde";
$stunde = 0;
$minute = 0;
$sekunde = 0;
print "<td bgcolor = #99CCFF><li>$zeit</td>";
print "</tr>";
$zeit =0;
}
Grüsse juha
Moin, du einer!
#Tageszaehler
for($daycount=0;$daycount<=6;$daycount++)
{
$wochentag = show_wochentag($daycount);
#Liest alle Batcheinträge des angegebenen Tages ein (von der betroffenen Person)
$select = "select date_format(date_add('$wochenstart_datum', interval $daycount day),'%Y-%m-%d') as datum";
my($tmp) = $dbh->prepare($select);
$tmp->execute();
$hash_tmp = $tmp->fetchrow_hashref;
$tages_dat = $hash_tmp->{datum};
#Tagesname wird aus Unterfunktion gerufen und ausgegeben
$tagesname = show_tagname($daycount);
print "</tr>";
Tipp: Zeilenanfang einer Tabelle mit <tr>. :)
print "<td>$tag_name</td>";
#Batcheinträge anzeigen
my($sth) = $dbh->prepare("select * from batch where pers_id = $personen_id and batch_datum = '$tages_dat' order by batch_zeit");
$sth->execute();
$maxrow = 0;
while($hash_eintraege = $sth->fetchrow_hashref)
{
print "<td>$hash_eintraege->{batch_zeit}</td>";
$maxrow++;
if($maxrow%2 != 0)
{
($h,$m,$s) = split(/:/,$hash_eintraege->{batch_zeit});
$ein =0;
Diese Zuweisung ist redundant. $ein wird eine Zeile weiter unten zugewiesen.
$ein = $h*3600+$m*60+$s;
}
else
{
($h,$m,$s) = split(/:/,$hash_eintraege->{batch_zeit});
$aus = 0;
redundant...
$aus = $h*3600+$m*60+$s;
Wurde $diff irgendwo initialisiert?
$diff = $diff+$aus-$ein;
}
$tag_total = $tag_total+$diff;
Wurde $tag_total mal irgendwo initialisiert? Jedenfalls nicht in diesem Bereich, den du gepostet hast. Abgesehen davon: In $diff steht doch schon das Tagestotal drin.
Entsprechend wären die nachfolgenden Umrechnungen anzupassen.
}
#Tagestotal berechnen und ausgeben
$stunde = "".int($tag_total/3600)."";
$minute = "".int(($tag_total-($stunde*3600))/60)."";
$sekunde = "".int(($tag_total-($stunde*3600)-($minute*60)))."";
$wochentotal += $tag_total;
$tag_total = 0;
zeitformat();
$zeit = "$stunde:$minute:$sekunde";
$stunde = 0;
$minute = 0;
$sekunde = 0;
print "<td bgcolor = #99CCFF><li>$zeit</td>";
print "</tr>";
$zeit =0;
}
Generallösung: Ganz am Anfang des Scripts
use strict;
Dann wirst du gezwungen, deine Variablen alle zu definieren. Undefinierte Variablen (mit irgendwelchen Speicherresten als Wert) werden nicht mehr genommen.
- Sven Rautenberg