Hi Guyz,

Ik zit weer eens met een vraagstuk... ik wil het aantal dagen bereken tussen twee datums..

daarvoor dacht ik onderstaand stukje codering te kunnen gebruiken:

//* RECONCILATION INSTELLINGEN		
$originalReconcileDate = $sqlData['Z_SYSTEM_RECONCILE_TIMESTAMP'];
$dateToday = new DateTime(date("Y-m-d H:i"));
$newReconcileDate = date("d-m-Y H:i", strtotime($originalReconcileDate));
$diff = $dateToday->diff($originalReconcileDate);
			
if($newReconcileDate == "01-01-1970"){
echo '<td></td>';
}else{
echo '<td>'.$newReconcileDate.'</td>';
}



echter ik krijg de foutmelding:
Warning: DateTime::diff() expects parameter 1 to be DateTimeInterface, string given in C:\wamp64\www\BP\members\inc\plugin.php on line 2332

echter ik kan 'm niet plaatsen... zal wel iets lulligs zijn maar ik staar me blind.... iemand een idee waar het manco zich bevind?
Ik lees elke keer iets van jou als "de handdoek in de ring gooien". Als je de fout gewoon googled zie je dat er al velen voor jou ook het probleem hadden. Ik hoor er ook bij. Je moet natuurlijk wel ook eens iets proberen.
Met vallen en opstaan lukt veel. Ok het gaat wat traag:)
Je kan toch niet willen dat de mensen hier jouw code schrijven.

Enkel als voorbeeld: Net een scriptje van vroeger eens hermaakt. Dubbel zo snel en 3k kleiner. Gewoon betere query's.

Ivo P op 01/04/2020 19:55:00

Wist je dat Mysql dat ook al voor je uit kan rekenen?


SELECT Z_SYSTEM_RECONCILE_TIMESTAMP, TO_DAYS(Z_SYSTEM_RECONCILE_TIMESTAMP) - TO_DAYS(NOW()) as verschil
FROM tabel





Hmmm interesting.. thnx... Ga ik zeker mee experimenteren. Heb nl wel op meerdere plekker het vershil dagen benodigd.. Lekker kort en krachtig. Komt de code alleen maar ten goede
<?php
//* RECONCILATION INSTELLINGEN
$reconDay = new DateTime($sqlData['originalReconcileDate']);
$dateToday = new DateTime();
$diff = $dateToday->diff($reconDay);
            
if($sqlData['originalReconcileDate'] == NULL){
    echo '<td><font color="red">Nog geen recon ingericht!</font></td>';
}else{
    echo '<td>'.$reconDay->format('d-m-Y').' <font size="1">('.$diff->format('%d dagen geleden').')</font></td>';
}
?>

Je maakt hier wel een fout, en een aantal dingen kunnen handiger gestructureerd worden. Je kunt er natuurlijk ook voor kiezen om alles in de query te regelen maar mogelijk is het handiger/makkelijker om code aan te passen dan SQL, dit moet je zelf weten.

Allereerst (en dit is dus een echte fout): DateInterval heeft formatteringsregels die mogelijk anders werken dan je zou denken. Het %d formatteringskarakter geeft je het aantal dagen verschil na aftrek van eventuele maanden.

Stel je hebt dus bijvoorbeeld 1 april en 2 mei, dan levert %d jou 1 (1 maand en 1 dag) in plaats van 31 dagen, wat je misschien zou verwachten. Hiervoor is %a bedoeld, zie ook de documentatie. Misschien wil je dat nog even aanpassen als je deze aanpak nog gebruikt voordat er mensen in de paniek schieten :p.

Dan ga je dingen uitrekenen die mogelijk helemaal niet uitgerekend hoeven te worden. Nu maakt dat in dit geval niet zo uit voor de snelheid, maar wat als deze berekening vele male complexer/duurder was? Staat je webserver mogelijk heel vaak te stampen op dingen die niet eens nodig zijn... dit is pure verspilling. Begin dus met het if-statement.

Ook kun je de programmeer- en weergavelogica verder uit elkaar trekken zodat je uiteindelijk een duidelijke streep tussen deze twee kunt aanbrengen.

Bijvoorbeeld dus als volgt:
<?php
if ($sqlData['originalReconcileDate'] == NULL) {
    $class = 'warning'; // geef het ding een opmaak
    $output = 'Nog geen recon ingericht!';
} else {
    // hier ga je pas rekenen
    $reconDay = new DateTime($sqlData['originalReconcileDate']);
    $dateToday = new DateTime();
    $diff = $dateToday->diff($reconDay);

    $class = 'message';
    $output = $reconDay->format('d-m-Y').' <span>('.$diff->format('%a').' dag(en) geleden)</span>';
}
?><td class="<?php echo $class; ?>"><?php echo $output; ?></td>

Hier verplaats je ook hoe td.warning, td.message en td.message span er verder uitzien naar een stylesheet, dit wil je loskoppelen van de HTML, mocht je dit ooit nog willen aanpassen dan kun je dat puur in CSS regelen en hoef je geen code op te breken...
Top dank je wel voor je uitgebreide toelichting. De DateInterval had ik inderdaad gelezen maar vergeten aan te passen. Dit is inmiddels doorgevoerd.

Ik heb dit nooit kunnen bedenken om een berekening met if statement te beginnen. Maar ondank ik in dit geval niet zoveel merk van de berekeninstijd hoor... deze gaat rap genoeg..maar inderdaad met 'n wat complexere berekening zou dit zo maar anders kunnen. Goed punt.

Dan over de opmaak... ik ben ook maar 'n ouwe zak hoor.. ik kom nog uit de html 1.0 periode. CSS wat was dat :-)
Ben daar helemaal niet in meegegroeid dus ik betrap me er vaak op dat ik de opmaak elke keer tussen de codering plaats. Ook hier onderga ik nog een leerproces:

Maar ik wil je nogmaals bedanken voor deze toelichting. Top!!!

Reageren