Uren niet meer laten afronden
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.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$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;
$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:
Hoe kan ik de uren dus ook als kwartier, halfuur en dergelijke laten tonen?
Gewijzigd op 18/08/2020 19:35:17 door Ray Mond
Ook weet ik niet of je op deze manier kunt rekenen met tijden, je doet nu net of dit getallen zijn:
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.
Gewijzigd op 18/08/2020 20:13:27 door Thomas van den Heuvel
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: https://ibb.co/Y0W0SK3
Gewijzigd op 18/08/2020 20:17:10 door Ray Mond
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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>';[/code]
$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>';[/code]
Mocht ik nu de uren en minuten van jouw deel verwerken bij mij in het script dan is de uitkomst heel raar haha..
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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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]
$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]
Gewijzigd op 18/08/2020 21:16:48 door Thomas van den Heuvel
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... :)
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.
Gewijzigd op 18/08/2020 22:26:48 door Thomas van den Heuvel
Ik had het geprobeerd met wat van bovenstaande code(s) maar dat mocht niet helpen voor wat ik graag zou willen :)
Het lijkt mij ook handig/verstandig wanneer er iemand in jouw organisatie aanwezig is die snapt wat deze code allemaal doet.
Je kunt bij Unix-timestamps eventueel wel (eindtijd - starttijd) / 3600 in bijvoorbeeld de query zetten: als je het tijdsverschil deelt door 3600 seconden per uur, krijg je de duur in uren plus fracties van uren. Een Unix-timestamp telt immers oplopend hoeveel seconden zijn verstreken sinds 1 januari 1970.
Nu zou je kunnen zeggen dat tegen die tijd deze programma's er toch niet meer zijn en dat je ook niet voor de eeuwigheid hoeft of zelfs kunt programmeren, maar het lijkt mij dat je een verstandigere koers kunt varen door het op een zodanige manier aan te pakken dat je hier niet (meer) afhankelijk van bent.
Herinner je nog de paniek met de milleniumbug? Ik ben er nog steeds van overtuigd dat dat verbleekt bij wat er ons in 2038 staat te wachten, ondanks het feit dat we dit met zijn allen mijlenver konden zien aankomen :).
Ward van der Put op 19/08/2020 08:39:59:
Je kunt bij Unix-timestamps eventueel wel (eindtijd - starttijd) / 3600 in bijvoorbeeld de query zetten: als je het tijdsverschil deelt door 3600 seconden per uur, krijg je de duur in uren plus fracties van uren. Een Unix-timestamp telt immers oplopend hoeveel seconden zijn verstreken sinds 1 januari 1970.
Maar dan ga je weer de mist in bij zomer- en wintertijd overgangen.
Ik denk dat de optie van Thomas met de DateInterval objecten het mooiste is.
Je moet alleen even doorzien dat je die begin- en eindtijd dan als input moet gebruiken voor je new DateTime()s
Ik hoop trouwens dat je niet alleen de tijd maar ook de datum in de database hebt staan (in een datetime kolom)?
Enkel wat ik graag zou willen is dat die 1.00 uur bijvoorbeeld 1.15 uur totaal gaat worden en daar lukt het niet, ik heb wat delen geprobeerd met bovenstaande scripts maar ook dat helpt jammer genoeg niet samen met die van mij.
Hij telt alleen maar de volle uren van 01:00 - 02:00 of bijvoorbeeld 12:00 - 13:00
12:15 - 12:30 telt hij niet en dat is juist wat ik wel wil, het hoeft niet opgeslagen te worden want dat is het al, het moet enkel als output getoond worden.
Gewijzigd op 19/08/2020 10:46:48 door Ray Mond
realiseer je dat strtotime() een integer oplevert die het aantal seconden sinds 1-1-1970 telt.
gemakshalve negeer jij de datum, dus we hebben het dan bijvoorbeeld over 10:45 op 1 jan 1970
(dat levert je dus 10*3600 + 45*60 = 38700 op.
Als je vervolgens als 2e tijd gebruikt 12:00 dan wordt dat 12*3600 = 43200
Verschil is 4500 (seconden) wat jij in $totaal opslaat.
Daarna reken jij 2 dingen uit:
$totaal / 3600 en daar maak jij een integer van.
Dus 1.20 en dat kap jij af tot 1.
En jij rekent om onduidelijke redenen ook $minuten uit met
$minuten = $totaal / 60;
Dus 4500 / 60 en dat levert 75 op.
Daar gaat het al mis:
je rekent nu uit wat het aantal minuten is dat er in $totaal zit. Maar daarbij houd je geen rekening met het feit dat je al de uren (in dit geval 1) in $uren stopt.
Je wilt dus eigenlijk ofwel $minuten = $resttijd / 60 doen
waarbij $resttijd = $totaal - 3600 * $uren;
Ofwel
$minuten = ($totaal / 60 ) % 60;
Wat dan 15 oplevert
En ja, dit was in wezen een afrondingsdingetje, terwijl je dus zou moeten delen met rest.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$datum = date("d-m-Y",strtotime($start));
$startTijd = date("H:i",strtotime($start));
$eindTijd = date("H:i",strtotime($eind));
$totaal = strtotime($eind) - strtotime($start);
$totaal = $totaal / 60 / 60;
$urenTotaal += $totaal;
$startTijd = date("H:i",strtotime($start));
$eindTijd = date("H:i",strtotime($eind));
$totaal = strtotime($eind) - strtotime($start);
$totaal = $totaal / 60 / 60;
$urenTotaal += $totaal;
Nu geeft hij letterlijk aan 1,00 - 1,25 - 1,50 - 1,75 - 2,00 uur en dergelijke aan :)
Natuurlijk niet allemaal tegelijk haha maar wat de ingevoerde uren zijn zeg maar :)
Daar zeg je:
Quote:
wat ik juist zoek is dat de uitkomst 1:15 gaat zijn.
Nu geef je een kwartier (00:15) weer als een kwart uur (0.25 of 0,25)?
Dit is niet hetzelfde.
Gewijzigd op 19/08/2020 15:57:05 door Thomas van den Heuvel
Thomas van den Heuvel op 19/08/2020 15:54:31:
Maar hiermee wijk je van je oorspronkelijke specificatie af?
Daar zeg je:
Nu geef je een kwartier (00:15) weer als een kwart uur (0.25 of 0,25)?
Dit is niet hetzelfde.
Daar zeg je:
Quote:
wat ik juist zoek is dat de uitkomst 1:15 gaat zijn.
Nu geef je een kwartier (00:15) weer als een kwart uur (0.25 of 0,25)?
Dit is niet hetzelfde.
Klopt inderdaad en heb je helemaal gelijk in maar eigenlijk gezien vanaf het begin zou dit het meest logische zijn om het als kwart uren te doen aangezien het ook zo zou zijn overal normaal gesproken.
Voor mij werkt dit nu ook prima, beetje verwarrend met het begin inderdaad maar komt in principe toch vrijwel op hetzelfde neer denk ik.
beetje verwarrend met het begin inderdaad maar komt in principe toch vrijwel op hetzelfde neer denk ik.
Zo ... ik geloof niet dat ik eerder zo veel vertwijfeling in 1 zin heb gezien :-)
>> Voor mij werkt dit nu ook prima, Zo ... ik geloof niet dat ik eerder zo veel vertwijfeling in 1 zin heb gezien :-)