Avatar billede Mikker Praktikant
20. april 2005 - 15:47 Der er 12 kommentarer og
1 løsning

Beregning af alder

Jeg efterlyser en funktion som kan udregne alder ud fra fødselsdato. Hvis man f.eks. overføre "18-04-2001" til funktionen skal den returnere 4 år. Overføre man "09-11-2003" skal den returnere 1 år.

Funktionen skal også acceptere fødselsdatoer fra før 1970 og tage højde for skudår.

Jeg har set mange scripts rundt omkring men ingen af dem virker ved begge ovenstående eksempler. Enten giver 18-04-2001 3 år ellers giver 09-11-2003 2 år hvilket jo ikke er rigtigt.
Avatar billede busschou Praktikant
20. april 2005 - 15:51 #1
du skal vel bare sammenligne datoen med dags dato og finde forskellen i år med DateDiff
http://www.ilovejackdaniels.com/php/php-datediff-function/
Avatar billede sukos Juniormester
20. april 2005 - 21:26 #2
Til lige præcis din "parameter", 18-04-2001 kan du bruge dette:

<?php

function brugeralder($var) {
if(trim($var) !="") {
$nu = date("d-m-Y", time());
$split1 = explode("-", $var);
$split2 = explode("-", $nu);

    if($split2[1] . $split2[0] >= $split1[1] . $split1[0]) {
    $antal_aar = ($split2[2]-$split1[2]);
    }else{
    $antal_aar = (($split2[2]-$split1[2])-1);
    }
return $antal_aar ." &aring;r";

    }else{
return "n/a";
    }
}

echo brugeralder("18-04-2001");

?>
Avatar billede sukos Juniormester
20. april 2005 - 21:27 #3
<?php

function brugeralder($var) {
if(trim($var) !="") {
$nu = date("d-m-Y", time());
$split1 = explode("-", $var);
$split2 = explode("-", $nu);

    if($split2[1] . $split2[0] >= $split1[1] . $split1[0]) {
    $antal_aar = ($split2[2]-$split1[2]);
    }else{
    $antal_aar = (($split2[2]-$split1[2])-1);
    }
return $antal_aar ." &aring;r";

    }else{
return "n/a";
    }
}

echo"18-04-2001: ". brugeralder("18-04-2001") ." || 09-11-2003: ". brugeralder("09-11-2003");

?>
Avatar billede coderdk Praktikant
21. april 2005 - 00:24 #4
Avatar billede coderdk Praktikant
21. april 2005 - 00:25 #5
Og et svar ;)
Avatar billede Mikker Praktikant
21. april 2005 - 10:19 #6
coderdk> Virker ikke: 09-11-2003 giver 2 år.
Avatar billede Mikker Praktikant
21. april 2005 - 10:21 #7
Sukos> Virker ikke: 18-04-2001 giver 3 år.
Avatar billede Mikker Praktikant
21. april 2005 - 10:36 #8
busschou> Jeg kan ikke få din datediff-funktion til at returnere en alder. Desuden er den baseret på Unix timestamp hvilket giver en begrænsing på 1970.
Avatar billede coderdk Praktikant
21. april 2005 - 10:55 #9
lykfeldt, så laver du noget forkert:

<?php

    function calcAge( $year, $month, $day, $hour = -1, $minute = 0 )
    {
        $yd = date( 'Y' ) - $year;
        $md = date( 'm' ) - $month;
        $dd = date( 'd' ) - $day;
        if ( $hour > -1 )
        {
            $hod = date( 'H' ) - $hour;
            $mid = date( 'i' ) - $minute;
        }
       
        if ( $mid < 0 )
        {
            // Negative minutes, adjust it and decrement hours
            $mid = 60 + $mid;
            $hod -= 1;
        }
        if ( $hod < 0 )
        {
            // Negative hours, adjust it and decrement days
            $hod = 24 + $hod;
            $dd -= 1;
        }
        if ( $dd < 0 )
        {
            // Negative days, what to do...
            if ( date( 'd', mktime( 0, 0, 0, date( 'm' ), -1, date( 'Y' ) ) ) < $day )
            {
                // The old date's day is past this month, so just set days to
                // the amount of days past in this month
                $dd = date( 'd' ) + 0;
            }
            else
            {
                // Calculate the day numbers of one month past with the old
                // date's day, and the day number of today to get the days
                $before = mktime( 0, 0, 0, date( 'm' ) - 1, $day, date( 'Y' ) );
                $beforenum = date( 'z', $before ) + ( date( 'L', $before ) && date( 'm', $before ) > 2 ? 1 : 0 );
                $todaynum = date( 'z' ) + ( date( 'L' ) && date( 'm' ) > 2 ? 1 : 0 );
                $dd = $todaynum - $beforenum;
            }
            // Decrement months
            $md -= 1;
        }
        if ( $md < 0 )
        {
            // Negative months, adjust it and decrement years
            $md = 12 + $md;
            $yd -= 1;
        }
        // Return it
        if ( $hour > -1 )
        {
            if ( $minute > -1 )
            {
                $res = array(
                        'year' => $yd
                        ,'month' => $md
                        ,'day' => $dd
                        ,'hour' => $hod
                        ,'min' => $mid
                    );
            }
            else
            {
                $res = array(
                        'year' => $yd
                        ,'month' => $md
                        ,'day' => $dd
                        ,'hour' => $hod
                    );
            }
        }
        else
        {
            $res = array(
                    'year' => $yd
                    ,'month' => $md
                    ,'day' => $dd
                );
        }
        return $res;
    }

    $age = calcAge( 2003, 11, 9 );
    echo "$age[year] år ($age[month] måneder og $age[day] dage)";

?>

Denne giver "1 år (5 måneder og 12 dage)"
Avatar billede Mikker Praktikant
21. april 2005 - 11:07 #10
coderdk> Jeg har ændret en smule i funktionen men resultatet burde være det samme. Når jeg kalder funktioene alder("09-11-2003") så får jeg 2 år. Hvorfor?

function alder($birth){
    $split = explode("-",$birth);
    $day = $split[0];
    $month = $split[1];
    $year = $split[2];
   
   
    $yd = date( 'Y' ) - $year;
    $md = date( 'm' ) - $month;
    $dd = date( 'd' ) - $day;
    if ( $hour > -1 )
    {
        $hod = date( 'H' ) - $hour;
        $mid = date( 'i' ) - $minute;
    }
 
    if ( $mid < 0 )
    {
        // Negative minutes, adjust it and decrement hours
        $mid = 60 + $mid;
        $hod -= 1;
    }
    if ( $hod < 0 )
    {
        // Negative hours, adjust it and decrement days
        $hod = 24 + $hod;
        $dd -= 1;
    }
    if ( $dd < 0 )
    {
        // Negative days, what to do...
        if ( date( 'd', mktime( 0, 0, 0, date( 'm' ), -1, date( 'Y' ) ) ) < $day )
        {
            // The old date's day is past this month, so just set days to
            // the amount of days past in this month
            $dd = date( 'd' ) + 0;
        }
        else
        {
            // Calculate the day numbers of one month past with the old
            // date's day, and the day number of today to get the days
            $before = mktime( 0, 0, 0, date( 'm' ) - 1, $day, date( 'Y' ) );
            $beforenum = date( 'z', $before ) + ( date( 'L', $before ) && date( 'm', $before ) > 2 ? 1 : 0 );
            $todaynum = date( 'z' ) + ( date( 'L' ) && date( 'm' ) > 2 ? 1 : 0 );
            $dd = $todaynum - $beforenum;
        }
        // Decrement months
        $md -= 1;
    }
    if ( $md < 0 )
    {
        // Negative months, adjust it and decrement years
        $md = 12 + $md;
        $yd -= 1;
    }
    // Return it
    if ( $hour > -1 )
    {
        if ( $minute > -1 )
        {
            $res = array(
                    'year' => $yd
                    ,'month' => $md
                    ,'day' => $dd
                    ,'hour' => $hod
                    ,'min' => $mid
                );
        }
        else
        {
            $res = array(
                    'year' => $yd
                    ,'month' => $md
                    ,'day' => $dd
                    ,'hour' => $hod
                );
        }
    }
    else
    {
        $res = array(
                'year' => $yd
                ,'month' => $md
                ,'day' => $dd
            );
    }
    $age = $res['year'];
    return $age;
}
Avatar billede coderdk Praktikant
21. april 2005 - 11:14 #11
Det ved jeg ikke, hvis jeg copy/paster din kode og kalder:

  echo alder( '09-11-2003' );

Så skriver den 1 (som den jo skal) - Står datoen korrekt på den server som du tester på?
Avatar billede Mikker Praktikant
21. april 2005 - 11:49 #12
Jeg overførte den forkerte variabel til funktionen. Det virker nu.
Avatar billede Mikker Praktikant
21. april 2005 - 11:51 #13
Det er muligt at nogle af jeres andres svar også har virket så. Ups! :/
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