Avatar billede nemlig Professor
10. oktober 2009 - 12:05 Der er 7 kommentarer og
3 løsninger

Antal dage mellem 2 datoer - mystisk.

Hejsa.
Jeg har denne lille funktion til at beregne antal dage mellem 2 datoer.

function datoDiffEngelsk($dato1,$dato2) {
    $dato1Dag = substr($dato1,8,2);
    $dato1Md = substr($dato1,5,2);
    $dato1Aar = substr($dato1,0,4);
    $dato2Dag = substr($dato2,8,2);
    $dato2Md = substr($dato2,5,2);
    $dato2Aar = substr($dato2,0,4);
    $t1 = mktime(0,0,0,$dato1Md,$dato1Dag,$dato1Aar);
    $t2 = mktime(0,0,0,$dato2Md,$dato2Dag,$dato2Aar);
    return ($t2-$t1) / (24*60*60);
}

Denne her giver korrekt 66 dage:
echo datoDiffEngelsk('2009-10-26','2009-12-31');

Men hvis jeg forøger perioden med bare 1 dag, fx. dette her:
echo datoDiffEngelsk('2009-10-25','2009-12-31');

Så er resultatet 67,0416666667 dage.

Nogen der har en løsning på dette.
Avatar billede Gudiik Nybegynder
10. oktober 2009 - 12:10 #1
kan du ikke bare gøre sådan at den tager kun 67?:D
Avatar billede nemlig Professor
10. oktober 2009 - 12:18 #2
Nej - det kan jeg ikke, da funktionen bruges til at beregne antal dage mellem flere perioder og hvor det samlede antal dage skal sammenlignes med et andet tal.
Jeg anvendte i første omgang floor, men så kan jeg ende op i at have en difference på 1 dag.
Der må være en løsning, så den regner korrekt.
Avatar billede repox Seniormester
10. oktober 2009 - 13:44 #3
Jeg har ikke nogen idé om hvad det er der gør du får sådan en skæv udregning.

men du kan prøve dette af:

function datoDiffEngelsk($dato1,$dato2)
{
        $t1 = explode("-", $dato1);
        $t2 = explode("-", $dato2);
       
        $t2 = mktime(0, 0, 0, $t2[1], $t2[2], $t2[0]);       

        $days = 0;
        while(mktime(0, 0, 0, $t1[1], $t1[2]+$days, $t1[0]) < $t2)
            ++$days;
           
        return $days;       
}
10. oktober 2009 - 14:49 #4
Nemlig, mystikken er opklaret:  Hvis de to datoer er paa hver sin side af skift mellem sommertid og vintertid saa laegges der en time til eller traekkes der en time fra.  Derfor kan du ikke bruge floor().  Men round() skulle virke.  Dette her virker i mit system:

<?
function datoDiffEngelsk($dato1,$dato2) {
    $dato1Dag = substr($dato1,8,2);
    $dato1Md = substr($dato1,5,2);
    $dato1Aar = substr($dato1,0,4);
    $dato2Dag = substr($dato2,8,2);
    $dato2Md = substr($dato2,5,2);
    $dato2Aar = substr($dato2,0,4);
    $t1 = mktime(0,0,0,$dato1Md,$dato1Dag,$dato1Aar);
    $t2 = mktime(0,0,0,$dato2Md,$dato2Dag,$dato2Aar);
    $t3 = round( ($t2-$t1) / (24*60*60));
    return $t3;
}

echo datoDiffEngelsk('2009-10-25','2009-12-31');
?>

Med andre ord, din kode regner korrekt, men du ville noget andet end det din kode udtrykker.
Avatar billede coderdk Praktikant
10. oktober 2009 - 15:30 #5
Du funktion kan i øvrigt skrives om til:

function datoDiffEngelsk($dato1,$dato2)
{
  return ( strtotime( $dato2 ) - strtotime( $dato1 ) ) / 86400;
}
Avatar billede coderdk Praktikant
10. oktober 2009 - 15:30 #6
(evt med round eller ceil)
Avatar billede nemlig Professor
11. oktober 2009 - 09:08 #7
Fedt nok - så jeg har nu 3 forskellige forslag, som alle virker.
Jeg skal bare lade være med at anvende floor. Jeg behøver heller ikke "round", idet de 2 sommertider må virke modsat, således alle perioder tilsammen giver 365 (i år 2009).
Tak for jeres løsninger. Jeg vælger at anvende Coderdk's forslag, da den er mest enkel.
Men da i alle har bidraget til en løsning, der virker, fordeler jeg pointene blandt jer.
Send venligst et svar.
11. oktober 2009 - 09:41 #8
Svar
Avatar billede repox Seniormester
11. oktober 2009 - 13:30 #9
jeg springer over.
Avatar billede coderdk Praktikant
11. oktober 2009 - 14:55 #10
:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester