Autor Zpráva
table
Profil *
Zdravím dnes ještě jednou,
je nějaká možnost vypočítat věk když mám datum narození uložený v Birthdate typu varchar?
Asi nastává otázka proč varchar, je to z toho důvodu že údaje jsou uloženy v CSV které jsou vytažený přímo ze hry a tam je údaj psaný ve formátu 25.2.1987(d.m.y)
Nemám žádný uploadovací script a csv do db nahrávám přímo v phpmyadminu. Zkoušel jsem měnit typ ale když tam CSV nahraju zapíše se samozřejmě do sloupce Birthdate samé nuly.
Takže otázka zní, dá se nějak spočítat věk nebo ne?
Děkuji za odpověď ikdyž logicky je jasné že ne.
Alphard
Profil
Není to velký problém, jenom si vytvořte objekt datetime pomocí php.net/manual/en/datetime.createfromformat.php.
Možná by šlo i strtotime(), nevím, dávno to nepoužívám.
table
Profil *
Děkuji,
zběžně jsem na to koukl a zatím španělská vesnice pro mě, ještě se k tomu někdy vrátím.
Zatím děkuji.
juriad
Profil
Nečíst! To jsem zase něco zmotal.
$date = DateTime::createFromFormat('j.n.Y', '25.2.1987');
$tehdy = $date->format('u');
$ted = time();
# $ted a $tehdy jsou v sekundách od 1.1.1970
$vek = ($ted-$tehdy)/(60*60*24*365.24); # neuvažuje přestupné roky, přesto je „nějak“ simuluje
echo (int)$vek; # vypíše 43
table
Profil *
vypíše 43 to je ale přeci špatně.


2013-1987=26
Alphard
Profil
u jsou mikrosekundy, což je zbytečné, a navíc problémové, nejsou všude podporovány. Brát to přes timestamp (což byl asi záměr) je problémové zase s lety před 1970. Ovšem když už vytvoříe instanci DateTime, použijeme metodu php.net/manual/en/datetime.diff.php.
Someone
Profil
<?php

function vek($dmy) {
    list($den,$mesic,$rok) = explode(".",$dmy);
    $y = Date("Y")-$rok;
    $t = strtotime("$den.$mesic.") - strtotime(Date("d.m."));
    return $t > 0 ? $y - 1 : $y;
}
echo vek("25.2.1987");

?>
table
Profil *
Someone:
Děkuji perfektní práce.
DJ Miky
Profil
Řešení od Someone ale nebude fungovat, pokud je někdo narozený 29. února a aktuální datum je mezi 1.1. a 28.2. v nepřestupný rok. V tom případě mu funkce přidá rok navíc.
Např. člověku narozenému 29.2.1996 funkce ve dnech 1.1.2013 až 28.2.2013 vypíše 17 let, i když mu je teprve 16.

Alphardem odkazované DateTime::diff() bude vracet správné výsledky.
Taps
Profil
table:
http://php.vrana.cz/zjisteni-veku-z-data-narozeni.php
table
Profil *
Taps:
http://php.vrana.cz/zjisteni-veku-z-data-narozeni.php
Tam jsem samozřejmě koukal a nic mi to neřeklo, bohužel.
Taps
Profil
table:
<?
$datum='25.02.1987';
list($den, $mesic, $rok) = explode($datum) ;
$narozeni = $rok.$mesic.$den;
echo floor((date("Ymd") - $narozeni) / 10000);
?>
table
Profil *
Taps:
<? $datum='25.2.1987'; list($den,$mesic,$rok) = explode($datum) ; $narozeni = $rok.$mesic.$den; echo floor((date("Ymd") - $narozeni) / 10000); ?>
Děkuji Vám že se mi snažíte pomoct,
tento kod mi výpíše 2013
Someone
Profil
<?php
 
function vek($dmy) {
    list($den,$mesic,$rok) = explode(".",$dmy);
    $y = Date("Y")-$rok;
    $t = strtotime("$den.$mesic.$rok") - strtotime(Date("d.m.$rok"));
    return $t > 0 ? $y - 1 : $y;
}
echo vek("25.2.1987");
 
?>

Ošetřil jsem DJ Mikym zmíněnou situaci.
Ještě menší úprava :)
table
Profil *
Someone:
<?php function vek($dmy) { list($den,$mesic,$rok) = explode(".",$dmy); $y = Date("Y")-$rok; $t = strtotime("$den.$mesic.1970") - strtotime(Date("d.m.1970")); return $t > 0 ? $y - 1 : $y; } echo vek("25.2.1987"); ?>

Zdá se že tohle už počítá správně, děkuji.
Alphard
Profil
Tak máte jakési šílené řešení, řekněme, že správně fungující. Ale uznejte sami, že je ten kód dost nečitelný, obtížně upravitelný, potenciální zdroj chyb.
Zamyslete se do budoucna, jestli by nebylo rozumnější obětovat 10 minut času, přečíst manuál u metody diff() a napsat jednoduché, na první pohled jasné, dobře čitelné řešení pomocí nativně implementované funkčnosti.

$b = new DateTime('25.2.1987');
$interval = $b->diff(new DateTime());
echo $interval->y;

S trochou syntaktického cukru od PHP 5.4:

echo (new DateTime('25.2.1987'))->diff(new DateTime())->y;

S použitím původního funkce [#2] pro libovolný tvar vstupu (funkční od 5.3, protože objekt je vytvořen statickou metodou):

echo DateTime::createFromFormat('j.n.Y', '25.2.1987')->diff(new DateTime())->y;

A začleněno do funkce:

function age($time, $format = 'j.n.Y')
{
 return DateTime::createFromFormat($format, $time)->diff(new DateTime())->y;
}

echo age('25.2.1987');

a ještě lépe, aby se defaultně parsovalo datum nativním způsobem:
function age($time, $format = null)
{
 $b = $format ? DateTime::createFromFormat($format, $time) : new Datetime($time);
 return $b->diff(new DateTime())->y;
}

echo age('25.2.1987');
Someone
Profil
[#16] Alphard
Jen dívat se na ten kód je příjemný zážitek ^^
Musím se přiznat, že jsem to sám nějak moc nezkoumal a napsal jsem to tak nějak od boku. Díky, žej si to tableovi uvedl na správnou míru, sám bych mu doporučil spíš tvé řešení, než mojí blind verzi :)
table
Profil *
[#16] Alphard
Děkuji, použil jsem Váš poslední způsob, jestli nevadí.
Ještě jednou děkuji

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: