Terve, tarvitsis muuttaa selkokielinen aika (esim. 26.8.1998) sellaiseen muotoon kun time() palauttaisi. En vain tiedä miten date() funktiolla saisin sen väännettyä, kun en tiedä missä järjestyksessä tiedot ovat siinä aikaleimassa.
Kiitos Blazelle, juuri se mitä etsin.
Vielä yksi kysymys tähän samaan asiaan liittyen: Jos on annettu jonkun ihmisen syntymäpäivä, esim. 26.3.1986 ja kun tiedetään tämä päivä 13.9.2009, niin miten voidaan laskea ikä? Putkassa profiil näyttää sinänsä väärin, kun se laskee esim. 19,234. Pitäisi siis saada vastaukseksi äskeisestä vuosia,päiviä.
Google auttoi tässäkin asiassa:
<?php $stamp = strtotime("21 march 1986 12:00:00"); //the date and time you where born $stamp2 = strtotime("now"); $diff = ($stamp2 - $stamp); $years = floor($diff / 31556927.29); //the average year is 365.242214 days :) $months = floor(($diff -$years * 31556927.29)/ 2629743.941); // the average month :P $days = floor(($diff- $years * 31556927.29 - $months * 2629743.941) / 86400); $hour = floor(($diff- $years * 31556927.29 - $months * 2629743.941 - $days * 86400)/ 3600); $min = floor(($diff- $years * 31556927.29 - $months * 2629743.941 - $days * 86400 - $hour * 3600) / 60); $sec = floor($diff- $years * 31556927.29 - $months * 2629743.941 - $days * 86400 - $hour * 3600 - $min * 60); $return = "I am $years year $months months $days days $hour h $min m $sec s old"; echo $return; ?>
Nuo epämääräiset keskiarvot eivät kyllä anna millään mittarilla oikeaa tulosta. Kannattaa mieluummin tehdä vaikka näin:
<?php // Syntymäaika $p0 = 1; $k0 = 1; $v0 = 1900; // Tämä päivämäärä $p1 = date("d"); $k1 = date("m"); $v1 = date("Y"); $dv = $v1-$v0; $dk = $k1-$k0; $dp = $p1-$p0; if ( $dp < 0 ) { $dk--; } if ( $dk < 0 ) { $dv--; $dk += 12; } $u = mktime(0,0,0,$k0+$dk, 1, $v0+$dv); if ( $dp < 0 ) $dp += date("t", $u); // dv,dk,dp = vuodet, kuukaudet, päivät echo "$dv v $dk kk $dp p"; ?>
Tuossa siis kuukaudet lasketaan siten, että jos syntymäpäivä on esimerkiksi 15. päivä, niin kuukaudet tulevat täyteen aina 15. päivä.
Käytetään valmiita palikoita, kun semmosia on kerran tarjolla: DateTime::diff. Selkeämpi ja sinänsä varmempi, että tuon toteutusta on tiiraillut varmastikin/toivottavasti useampi silmäpari, kuin mitä sen oman virityksen.
<?php // Remember to set default timezone in php.ini or here // Create a new DateTime object with the known date $birthDate = new DateTime('1986-03-26 12:00:00'); /* * Calculate difference. Note that the default * time for new DateTime object is "now". */ $diff = $birthDate->diff(new DateTime()); /* * Print full years, months and days of the difference * See var_dump($diff); for full public property listing. */ echo sprintf('%s years %s months %s days', $diff->y, $diff->m, $diff->d); ?>
EDIT: Mistä höpisöön alla oleva ;). Kyse oli siis siitä, että VB:stähän löytyy allekirjoittaneen päivän muinoin pelastanut DateDiff
-funkkari, enkä ittekään meinannu ensin muistaa DateTime
-luokan diff
-metodia, mutta -2 sekuntia manuaalissa ja sieltähän se iski naamaan ko sata sienestäjää syyshämärässä.
En mä kyllä ymmärrä miten tää olisi merkittävästi helpompaa VB:lläkään tai mikä tuossa muka on vaikeaa..
Ainoa vaikeus on se, että tehtävänannossa ei kerrota miten pitää laskea jos on syntynyt karkauspäivänä. Eli onko 1.3.2009 silloin tasan xx vuotta vai xx vuotta ja 1 päivä.
Senhän voi tehdä vaikka näin (lähdekoodi)
Kiitos teille, saimpas toimimaan halutulla tavalla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.