eli seuraava koodinpätkä laskee iän väärin.
Kun annan funktiolle getAgeByDate(01, 01, 1968), niin se palauttaa iän arvoksi 36, tämä tapahtuu vain, kun vuosi luku on 1968 tai vanhempi.
function getAgeByDate($syntym_kk, $syntym_pv, $syntym_vv) { $iTimeStamp = (@mktime() - 86400) - @mktime(0, 0, 0, $syntym_kk, $syntym_pv, $syntym_vv); if(($syntym_kk < 1) || ($syntym_pv < 1) || ($syntym_vv < 1)) { $iYears = 0; } else { $iDays = $iTimeStamp / 86400; $iYears = number_format(($iDays / 365.25),2); } return $iYears; }
Yksi ainakin mikä mättää on vuoden pituus. Vuoden pituus ei ole 365,25 vaan 365 päivää tai karkausvuonna 366 päivää. Karkausvuosi taas on joka neljäs vuosi paitsi jos vuosi on jaollinen kymmenelle mutta ei sadalla.
Kannattaa tutustua https://www.php.net/date etenkin parametriin L.
Muoks: Tarkemmin kun ajattelin, ei tuossa tarvitse tietää mitään karkausvuosista, nopeasti kyhäsin seuraavan joka vaikuttaisi palauttavan oikeita arvoja:
<?php function Ikä ($syntymäpäivä, $syntymäkuukausi, $syntymävuosi) { $vuodet = date("Y") - (int) $syntymävuosi; $kuukaudet = date("n") - (int) $syntymäkuukausi; $paivat = date("j") - (int) $syntymäpäivä; if ($paivat > date("t")) { $kuukaudet++; $paivat = $paivat - date("t"); } if ($paivat < 1) { $kuukaudet--; $paivat = date("t", mktime(0,0,0,date("n")-1,1,date("Y"))) - 1; } if ($kuukaudet > 12) { $vuodet++; } if ($kuukaudet < 1) { $vuodet--; $kuukaudet = 11; } return "{$vuodet} vuotta {$kuukaudet} kuukautta ja {$paivat} päivää"; } echo "<pre>"; echo Ikä(1,1,1968) . "\n"; echo Ikä(22,10,1991); echo "</pre>"; /* Palauttaa 37 vuotta 8 kuukautta ja 20 päivää 13 vuotta 11 kuukautta ja 30 päivää */ ?>
Varmasti on n^2 tehokkaampiakin tapoja, tuossa on yksi josta voi soveltaa.
Muoks2: Joku lirii skriptissä, nuoremmalla jannulla olisi skriptin mukaan synttärit huomenna vaikka todellisuudessa niihin on vielä 1kk ja 1pv, eli älä ota ainakaan tuollaisenaan käyttöön :)
kokeile tätä
<? function laske_ika($paiva,$kuukausi,$vuosi) { $syntynyt=mktime(0,0,0,$kuukausi,$paiva,$vuosi); $vuodet=date("Y")-date("Y",$syntynyt); $kuukaudet=date("m")-date("m",$syntynyt); $paivat=date("d")-date("d",$syntynyt); echo "vuodet:$vuodet kuukaudet:$kuukaudet paivat:$paivat"; } laske_ika(8,6,1990); ?>
muokkaa sitä sitten vaan palauttamaan tuloksen haluamassasi muodossa jne...
Aika jännää olla 15 vuotta ja -3 kuukautta vanha, sellainen tuo Mazulin skripti :P
niin, siis tuossa mazulin skriptissähän on selvä ajatusvirhe. jos esim. nyt on yhdeksäs kuukausi ja joku on syntynyt kymmenennessä kuussa niin $kuukaudet on -1 ja sama pätee päiviinkin, joten tuo ei toimi noin.
Alkuperäiseen kysymykseen, timestampeilla pelatessa pitää muistaa sen rajoitukset:
https://www.php.net/manual/fi/function.mktime.
Pitihän se itsekin kokeilla kerta muutkin. Timestampeilla vasiten itsekin värkkäsin, vaikka ne ovatkin liian rajoittuneita että tällä skriptillä olisi mitään laajempia käyttömahdollisuuksia. Mutta minkäs teet kun leftover teki jo tuolla paremmalla tavalla ;)
<?php function laske_ikä($päivä,$kuukausi,$vuosi) { $nyt = time(); $silloin = mktime(0, 0, 0, $kuukausi, $päivä, $vuosi); $aikaa_kulunut = $nyt - $silloin; //Vuodessa sekunteja 31536000 $vuodet = floor($aikaa_kulunut / 31536000); //Kuukaudessa sekunteja 31556926 $kuukaudet = floor(($aikaa_kulunut % 31556926) / 2629743.83); //Päivissä sekunteja 86400 $päivät = floor(($aikaa_kulunut % 2629743.83) / 86400); return "Aikaa kulunut $vuodet vuotta $kuukaudet kuukautta ja $päivät päivää"; } echo laske_ikä(29,8,1984); ?>
En nyt äkikseltään keksi miten tuo reagoi niihin karkauspäiviin. Oikein tuo kuiten tuntuisi oman ikäni näyttävän.
No tulipa taas turhaa värkättyä mutta mitäpä siitä. Aikaahan se vain on ;)
Aihe on jo aika vanha, joten et voi enää vastata siihen.