Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Iän lasku ongelma? mikä vikana?

DMRC [21.09.2005 08:50:20]

#

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;

}

leftover [21.09.2005 09:13:03]

#

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 :)

Mazuli [21.09.2005 10:59:51]

#

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...

Juice [21.09.2005 19:39:05]

#

Aika jännää olla 15 vuotta ja -3 kuukautta vanha, sellainen tuo Mazulin skripti :P

jgz [21.09.2005 22:11:47]

#

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.

kayttaja-2791 [22.09.2005 00:03:10]

#

Alkuperäiseen kysymykseen, timestampeilla pelatessa pitää muistaa sen rajoitukset:
https://www.php.net/manual/fi/function.mktime.php

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 ;)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta