Yo!
Jag sitter och försöker klura ut hur jag ska ta och omvandla födelsedatum till hur gammal en person är.
Jag har informationen i "datetime" (0000-00-00) i variabeln "$user_age" och funderar på om någon har ett bra tips till hur man kan omvandla det till hur gammal man är i år? Alla tips välkommnas.
Från datetime till ålder
18 svar · 699 visningar · startad av Webslave
Jag kom, jag såg och jag förstod inte ett jota :)
Det är absolut ingen perfekt kod (du får inte exact rätt antal månader och år alltid men bra nära tror jag. Räknar med 30.5 dagar/månad och 365.25 dagar/år
Funktionen tar 2 datum minus varandra så den får antalet sekunder mellan de 2 datumen och trixar lite med matte efter det för att göra om sekunder till dagar, veckor, månader och år.
<?
Function DateDiff ($interval, $date1,$date2)
{
// get the number of seconds between the two dates
$timedifference = $date2 - $date1;
switch ($interval)
{
case "y":
$retval = bcdiv($timedifference, 31557600);
break;
case "m":
$retval = bcdiv($timedifference, 2635200);
break;
case "w":
$retval = bcdiv($timedifference ,604800);
break;
case "d":
$retval = bcdiv( $timedifference,86400);
break;
case "h":
$retval = bcdiv ($timedifference,3600);
break;
case "n":
$retval = bcdiv( $timedifference,60);
break;
case "s":
$retval = $timedifference;
break;
}
return $retval;
}
?>
<?
$currenttime = time();
$newtime = mktime (0,0,0,9,12,1980);
$temptime = DateDiff ("y",$newtime ,$currenttime);
echo "Interval between two dates: ".$temptime;
?>
Skicka med de 2 datum som du vill gämföra (now och 1980-09-12 i detta exempel) och vad du vill ha som svar, y=year, m=month, w=week osv.
Hoppas du fattar lite mer nu :)
/Viktor
En av många trådar som beskriver dit problem:
http://www.webforum.nu/showthread.php?s=&threadid=14357&highlight=�lder
Tackar Jörgen... det blev kanske inte exakt som man ville men nsätan. Det blir ju att om man är född 1980-06-02 så är man 22 2002-01-01 (den räknar bara åren) men om ingen annan kan komma med en lite modifiering på den så får det duga ;)
??
Det scriptet som jag postade fungerar :) där blir man bara 21 om man knappar in de datum som du har som exempel :)
/Viktor
Viktor... jag förstår inte ditt script, det var därför jag itne använde det... jag ser inte hur jag ska kunna få ut en ålder av det där (newbie) om du orkar förklar vad allt betyder så tar jag gärna ditt script... man vill ju kunna vara så precis som möjligt ;)
DateDiff=avstånd mellan 2 datum, tex ett födelsedatum och dagens datum :)
Du kan altså få antalet år som har gått mellan 1980-06-02 och 2002-01-01 genom att anroppa funktionen DateDiff på följande sätt
$dagensdatum = mktime(0,0,0,1,1,2002);
$fodelsedatum = mktime (0,0,0,2,06,1980);
$alder = DateDiff ("y",$fodelsedatum ,$dagensdatum);
echo "Ålder (i år): ".$alder;
/Viktor
Men om jag hämtar datumet från variabeln $rad["user_age"] vart ska då den in i hela den där kallasen med kod? :)
Jag är inte någon hejjare på PHP (kan egentligen inget om det :)) men det borde finnas någon formaterings funktion för datum, typ
date("yyyy-mm-dd",$rad["user_age"])
kolla på http://www.php.net.
/Viktor
Det där vet jag men jag syftade i den kod som du har givit mig.
När du gjort din datediff mellan födelsedatumet och dagens datum (i dagar) delar du kalaset med 365.2375, då får du fram rätt antal år, på dagen. :)
$dagensdatum = mktime(0,0,0,1,1,2002);
$fodelsedatum = mktime (0,0,0,2,06,1980); <-- Här är det som du får lägga in ditt datum, $rad["user_age"]
$alder = DateDiff ("y",$fodelsedatum ,$dagensdatum);
echo "Ålder (i år): ".$alder;
/Viktor
Det gick inte bra det... jag hämtar användarens födelsedag ($rad["user_age"]) och lägger in den, och sedan så ska den jämföras med dagens datum ($date) och då la jag in $date... titta hur jag gjorde nedanför:
$dagensdatum = mktime($date);
$fodelsedatum = mktime ($rad["user_age"]);
$alder = DateDiff ("y",$fodelsedatum ,$dagensdatum);
echo "Ålder (i år): ".$alder;
Och den returnerar 0...
I mktime() ska du plocka in tidsdelarna kommaseparerade:
mktime(timme, minut,sekund,månad,dag,år)
du får ut ett unix timestamp.
Du behöver inte använda mktime överhuvudtaget i ditt skript.
I din sql-sats skriver du:
SELECT UNIX_TIMESTAMP(user_age) as user_age FROM tabell
Då får du ut user_age som unix timestamp.
För att få aktuellt timestamp använder du time(). Använder du UNIX_TIMESTAMP() i din sql-sats så blir ditt skript:
$dagensdatum = time();
$fodelsedatum = $rad["user_age"];
$alder = DateDiff ("y",$fodelsedatum ,$dagensdatum);
echo "Ålder (i år): ".$alder;
Det ända som jag kan gissa på är att $rad["user_age"] inte är av rätt format, det måste formateras till ett datum (datatypen date) för att det ska fungera. Som du har skrivit det nu så blir det nog error i mktime och det blir samma som $date.
/Viktor
Tackar Matte... det där fungerade perfekt ;)
Sen skulle du förstås kunnat ta fram det direkt i sql-frågan:
$sql = "SELECT DATE_FORMAT(
FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(user_age)+1), '%Y')+0
AS age FROM tabell";
$result = mysql_query($sql);
$rad = mysql_fetch_array($result);
echo "Ålder: ".$rad['age'];
