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?
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.
Mja, maar dat feest is begin 2038 afgelopen :).

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)?
Start en eindtijd gaat inderdaad samen met de datum (datetime), enkel op de voorbeeld die ik stuurde zie je de tijden alleen en dat is voor mij ook prima, meer dan prima zelfs.

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.
Niet goed gelezen dat dit de post van Adaptive was en niet TO, maar verhaal geeft wel uitleg:

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
Voor de goede orde zou ik mijn code snippet nog aan moeten passen zodat het minuten-deel uren bijtelt op het moment dat deze boven de 60 minuten gaat :). Wat dat betreft was het misschien handiger geweest om gewoon enkel een minuten-totaal bij te houden, en als je dat dan later op wil splitsen in uren en minuten is dat in zekere zin een weergave-kwestie.

En ja, dit was in wezen een afrondingsdingetje, terwijl je dus zou moeten delen met rest.
Bleek toch niet zo heel lastig uiteindelijk:


$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;


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 :)
Maar hiermee wijk je van je oorspronkelijke specificatie af?

Daar zeg je:
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.
Thomas van den Heuvel op 19/08/2020 15:54:31

Maar hiermee wijk je van je oorspronkelijke specificatie af?

Daar zeg je:
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.
>> Voor mij werkt dit nu ook prima, [color="red"]beetje verwarrend[/color] met het begin inderdaad maar komt in principe [color="red"]toch[/color] vrijwel op hetzelfde neer [color="red"]denk ik[/color].

Zo ... ik geloof niet dat ik eerder zo veel vertwijfeling in 1 zin heb gezien :-)

Reageren