Uren niet meer laten afronden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Ray Mond

Ray Mond

18/08/2020 19:31:53
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;


En dan het stukje waar de uren worden opgeroepen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<th colspan="4"><?=number_format($urenTotaal, 2, ',', '.')?> uur</th>


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
 
PHP hulp

PHP hulp

14/04/2021 10:58:51
 
Thomas van den Heuvel

Thomas van den Heuvel

18/08/2020 20:12:29
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$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.
Gewijzigd op 18/08/2020 20:13:27 door Thomas van den Heuvel
 
Ray Mond

Ray Mond

18/08/2020 20:15:27
Quote Anchor link
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: https://ibb.co/Y0W0SK3
Gewijzigd op 18/08/2020 20:17:10 door Ray Mond
 
Adoptive Solution

Adoptive Solution

18/08/2020 20:53:32
Quote Anchor link
Cito toets nivo.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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]
 
Ray Mond

Ray Mond

18/08/2020 20:59:19
Quote Anchor link
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..
 
Thomas van den Heuvel

Thomas van den Heuvel

18/08/2020 21:04:04
Quote Anchor link
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?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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]
Gewijzigd op 18/08/2020 21:16:48 door Thomas van den Heuvel
 
Ray Mond

Ray Mond

18/08/2020 21:25:12
Quote Anchor link
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... :)
 
Ozzie PHP

Ozzie PHP

18/08/2020 22:14:46
Quote Anchor link
>> ... 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.
 
Thomas van den Heuvel

Thomas van den Heuvel

18/08/2020 22:23:46
Quote Anchor link
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
 
Ray Mond

Ray Mond

18/08/2020 22:34:15
Quote Anchor link
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 :)
 
Thomas van den Heuvel

Thomas van den Heuvel

18/08/2020 22:53:50
Quote Anchor link
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.
 
Ward van der Put
Moderator

Ward van der Put

19/08/2020 08:39:59
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

19/08/2020 10:02:58
Quote Anchor link
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 :).
 
Ivo P

Ivo P

19/08/2020 10:42:42
Quote Anchor link
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)?
 
Ray Mond

Ray Mond

19/08/2020 10:46:26
Quote Anchor link
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.
Gewijzigd op 19/08/2020 10:46:48 door Ray Mond
 
Ivo P

Ivo P

19/08/2020 10:58:39
Quote Anchor link
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
 
Thomas van den Heuvel

Thomas van den Heuvel

19/08/2020 12:25:28
Quote Anchor link
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.
 
Ray Mond

Ray Mond

19/08/2020 14:22:17
Quote Anchor link
Bleek toch niet zo heel lastig uiteindelijk:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;


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 :)
 
Thomas van den Heuvel

Thomas van den Heuvel

19/08/2020 15:54:31
Quote Anchor link
Maar hiermee wijk je van je oorspronkelijke specificatie af?

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
 
Ray Mond

Ray Mond

19/08/2020 16:00:36
Quote Anchor link
Thomas van den Heuvel op 19/08/2020 15:54:31:
Maar hiermee wijk je van je oorspronkelijke specificatie af?

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.
 
Ozzie PHP

Ozzie PHP

19/08/2020 16:50:00
Quote Anchor link
>> Voor mij werkt dit nu ook prima, 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 :-)
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.