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.
Annonceindlæg tema
Cloud & AI
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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 ." år"; }else{ return "n/a"; } } echo brugeralder("18-04-2001"); ?>
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 ." år"; }else{ return "n/a"; } } echo"18-04-2001: ". brugeralder("18-04-2001") ." || 09-11-2003: ". brugeralder("09-11-2003"); ?>
21. april 2005 - 00:24
#4
21. april 2005 - 00:25
#5
Og et svar ;)
21. april 2005 - 10:19
#6
coderdk> Virker ikke: 09-11-2003 giver 2 år.
21. april 2005 - 10:21
#7
Sukos> Virker ikke: 18-04-2001 giver 3 år.
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.
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)"
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; }
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å?
21. april 2005 - 11:49
#12
Jeg overførte den forkerte variabel til funktionen. Det virker nu.
21. april 2005 - 11:51
#13
Det er muligt at nogle af jeres andres svar også har virket så. Ups! :/
Vi tilbyder markedets bedste kurser inden for webudvikling