Beste mensen,

We hebben een script (overgenomen) nu worden de aantal uren (werkzaamheden) ingevoerd in de database als starttijd bijvoorbeeld 01:15 tot 01:30, dit is prima opgenomen in de database maar op moment dat ik de uren dus opvraag staat het echter afgerond als 0 uur, pas op het moment dat ik van 01:00 tot 02:00 als voorbeeld zal doen dan zal het weergegeven worden als 1 uur.


$datum = date("d-m-Y",strtotime($start));
				$startTijd = date("H:i",strtotime($start));
				$eindTijd = date("H:i",strtotime($eind));

				$totaal = $eindTijd - $startTijd;

				//$totaal = $totaal / 60;
				$urenTotaal += $totaal;


En dan het stukje waar de uren worden opgeroepen:


<th colspan="4"><?=number_format($urenTotaal, 2, ',', '.')?> uur</th>


Hoe kan ik de uren dus ook als kwartier, halfuur en dergelijke laten tonen?
Mja, nu rondt je alles af op uren, dan is het nogal wiedes dat het niet werkt.

Ook weet ik niet of je op deze manier kunt rekenen met tijden, je doet nu net of dit getallen zijn:
$totaal = $eindTijd - $startTijd;

Maar die vlieger gaat (sowieso) niet op en kan hele onvoorspelbare resultaten geven, want "H:i" (het formaat van $eindTijd en $startTijd) is in wezen een string dus als je daar vervolgens vrolijk mee gaat rekenen alsof het getallen zijn wordt dit mogelijk allemaal getypecast en belandt misschien wel de helft van zo'n tijd in de prullenbak, wellicht met totaal onverklaarbare resultaten als gevolg.

Ik zou je voorstellen je te verdiepen in de datum/tijd classes. Daarmee kun je ook redelijk makkelijk verschillen berekenen en dit schept misschien ook wat meer bewustzijn van tijdszones.
Hij laat het inderdaad tot zover ik weet en kan zien ook alleen maar zien als een getal, dit is voor mij ook voldoende, als output hoef ik alles maar (opgeteld) te zien dus dat werktijd 01:00 - 02:00 vandaag bijvoorbeeld 1 uur was en morgen 15:00 - 17:00 2 uren is.. dit hoeft niet opgeslagen te worden want hij haalt die tijd al uit de database, echter laat hij de output alleen maar zien als volle uren.

01:15 - 01:30 = 0 uur
01:00 - 02:00 = 1 uur

wat ik juist zoek is dat de uitkomst 1:15 gaat zijn.

Voorbeeld:
Cito toets nivo.

 <?php

$start = '00:30';
$eind  = '00:45';

$startTijd = strtotime( $start);
$eindTijd  = strtotime( $eind );

echo '<p>startTijd : ' . $startTijd . ' ( ' . $start . ' )<br />';
echo 'eindTijd : '     . $eindTijd  . ' ( ' . $eind  . ' )</p>';

$totaal = $eindTijd - $startTijd;
echo '<p>totaal : ' . $totaal . ' seconden</p>';

$uren    = (int)($totaal / 60 / 60 );
$minuten = $totaal / 60 ;

echo '<p>' . $uren . ' uur en ' . $minuten . ' minuten</p>';
Zou ook mogelijk zijn inderdaad maar dan roept hij het niet meer uit via de database, waar juist de tijd staat als vermelding.

Mocht ik nu de uren en minuten van jouw deel verwerken bij mij in het script dan is de uitkomst heel raar haha..
Ai caramba, UNIX timestamps? :/

Gebruik bij voorkeur de date/time classes...

Ik weet verder niet in welke setting je dit alles gebruikt, maar er zijn allerlei randgevallen waar je mogelijk rekening mee moet houden zoals overgangen rond middernacht of mogelijk over meerdere dagen, afhankelijk van hoe je dingen formatteert kunnen berekeningen mogelijk misgaan.

Het onderstaande illustreert het gebruik redelijk, de rest is aan jou, ik neem aan dat voor je werk is?
<?php
$dates = array(
    array('2020-08-17 23:45', '2020-08-18 01:30'), // different days
    array('01:00', '02:00'), // same day
    // etc
);

$myFormat = 'H:i';
$total = array('hours' => 0, 'minutes' => 0);

foreach ($dates as $date) {
    // assumption: all times are recorded in the same timezone...
    // assumption: all times occur on the same day... otherwise consider adding a DATE to the TIMEs...
    $start = new DateTime($date[0]);
    $end   = new DateTime($date[1]);

    $diff = $end->diff($start); // this returns a DateInterval object
    $diffHours = ($diff->days * 24) + $diff->h; // track total hours, note $diff->h does not go beyond 24
    $total['hours'] += $diffHours;
    $diffMinutes = $diff->i;
    $total['minutes'] += $diffMinutes;

    ?>start <?php echo $start->format($myFormat); ?> end <?php echo $end->format($myFormat); ?> difference <?php echo $diffHours.':'.$diffMinutes; ?><br><?php
}
?>total: <?php echo $total['hours'].':'.$total['minutes']; ?>[end]
Het is inderdaad voor werkuren en ook bovenstaande zal voor mij niet echt helpen vrees ik aangezien je dan de dagen in arrays zet en alles, bij mij haalt hij het echt uit de database en zal dat gewoon puur opgeteld moeten worden maar hoe... :)
>> ... aangezien je dan de dagen in arrays zet en alles, bij mij haalt hij het echt uit de database ...

Thomas geeft een voorbeeld van hou je iets kunt berekenen. Je kunt zelf uiteaard de data uit de database gebruiken.
Ray Mond op 18/08/2020 21:25:12
maar hoe... :)

Tijd om een vacature voor een programmeur te plaatsen?
Of anders enige eigen inventiviteit gewenst.
Nja heel eerlijk gezegd had ik niet gedacht dat het nog zo lastig zou zijn haha.. Ik dacht het script telt wel de hele uren maar waarom kan hij dan geen kwartier en dergelijke optellen...

Ik had het geprobeerd met wat van bovenstaande code(s) maar dat mocht niet helpen voor wat ik graag zou willen :)
Sja je zult het zelf moeten inpassen in je eigen code, het zal niet direct altijd 100% passen zodat je enkel hoeft te knippen en te plakken.

Het lijkt mij ook handig/verstandig wanneer er iemand in jouw organisatie aanwezig is die snapt wat deze code allemaal doet.

Reageren