2010-10-26 10 views
3

J'ai un champ de MySQL DATETIME qui tient la date de naissance d'un utilisateur. Je veux utiliser cette date pour afficher l'âge de l'utilisateur en années.CakePHP: Aide de temps pour montrer l'âge

Y a-t-il une méthode de l'aide de base de temps pour faire ceci?

En outre, pourquoi lorsque vous ajoutez un champ DATETIME à un formulaire dans Cake, ne permet-il pas de sélectionner une date inférieure à 1990?

Merci,

Jonesy

Répondre

3

Ajout d'une nouvelle réponse parce que le code sera affiché mieux. Comment je voudrais faire cela:

dans votre modèle créer virtual field comme ça. Puis utilisez-le comme champ normal dans le modèle.

var $virtualFields = array(
    'age' => "YEAR(NOW())-YEAR(YourModelName.datetimeField)" 
); 

Ensuite, utilisez-le comme champ normal dans le modèle. :)

+0

cela semble bon, mais im gettin une erreur SQL.voici mon code var $ virtualFields = array ( \t 'age' => "(YEAR (NOW() - YEAR (User.dob))" \t), et l'erreur est Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'AS 'User__age' FROM' users' AS' User' O WH 1 = 1 – iamjonesy

+1

Il y avait une faute de frappe - nombre de parenthèses erronées :) Obtenez le code et essayez encore –

+1

Cela ne fonctionne que si c'est actuellement après l'anniversaire de la personne cette année-là. Si l'anniversaire de l'utilisateur est en août et que vous l'exécutez en mars, il indiquera que l'utilisateur a un an de plus. – tyjkenn

3

timeAgoinWords() peut faire ce que vous voulez pour la première partie. Consultez le Book

Cela concerne les champs de formulaire automagic. Vous pouvez ajuster la plage de l'année avec des options. Découvrez le Book.

1

Vous pouvez effectuer le calcul en utilisant les fonctions PHP standard - regardez dans la section date. Je ne vais pas vous dire comment le faire parce que vous apprendrez énormément en le faisant vous-même.

Je dirai que vous devez faire attention pour obtenir un résultat précis. 365 jours n'est pas toujours une année et un mois a un nombre variable de jours.

Vous pouvez configurer la plage de sélection de date dans l'assistant de formulaire de gâteau.

+0

vous avez tout à fait raison Leo, les bases sont toujours requises –

4

la fonction est appelée timeAgoInWords

<?php echo $this->Time->timeAgoInWords(
     '1975-12-29 13:40', 
     array(
      'end'=>'+150 years' 
    ) 
);?> 

Le paramètre final signifie pour afficher la fois il y a des mots jusqu'à ce que la date est inférieure à 150 ans (au moins je ne l'ai pas entendu parler de l'homme 150yo :)))).

Le résultat courant est: né: avant 34 ans, 9 mois, 4 semaines

mais aussi vérifier l'API et CookBook comme Jason suggère

+1

+1 Je ne connaissais pas cette fonction, mais je maintiens ma réponse que vous devriez vous familiariser avec les fonctions de date de PHP! – Leo

+1

merci pour cela, maintenant je jsut besoin de comprendre comment le montrer en années seulement comme dans l'âge: 34 – iamjonesy

0

i utilise toujours cette méthode testée:

/* 
* @return int age (0 if both timestamps are equal or empty, -1 on invalid dates) 
* 2009-03-12 ms 
*/ 
function age($start = null, $end = null, $accuracy = 0) { 
    $age = 0; 
    if (empty($start) && empty($end) || $start == $end) { 
     return 0; 
    } 

    if (empty($start)) { 
     list($yearS, $monthS, $dayS) = explode('-', date(FORMAT_DB_DATE)); 
    } else { 
     $startDate = $this->fromString($start); 
     $yearS = date('Y', $startDate); 
     $monthS = date('m', $startDate); 
     $dayS = date('d', $startDate); 
     if (!checkdate($monthS, $dayS, $yearS)) { 
      return -1; 
     } 
    } 
    if (empty($end)) { 
     list($yearE, $monthE, $dayE) = explode('-', date(FORMAT_DB_DATE)); 
    } else { 
     $endDate = $this->fromString($end); 
     $yearE = date('Y', $endDate); 
     $monthE = date('m', $endDate); 
     $dayE = date('d', $endDate); 
     if (!checkdate($monthE, $dayE, $yearE)) { 
      return -1; 
     } 
    } 

    $n_tag = $dayE; 
    $n_monat = $monthE; 
    $n_jahr = $yearE; 
    $g_tag = $dayS; 
    $g_monat = $monthS; 
    $g_jahr = $yearS; 
    $g_date = mktime(0,0,0,$g_tag,$g_monat,$g_jahr); 

    if (($n_monat>$g_monat)||(($n_monat == $g_monat)&&($n_tag>$g_tag))||(($n_monat == $g_monat)&&($n_tag==$g_tag))) { 
     $age = $n_jahr-$g_jahr; // is correct if one already had his birthday this year 
    } else { 
     $age = $n_jahr-$g_jahr-1; // is correct if one didnt have his birthday yet in this year 
    } 
    return $age; 
} 

il peut probablement être refactured mais il fonctionne avec des années bissextiles et toutes sortes de choses. donc je jamais pris la peine ...

il utilise une constante vous n'avez

est juste: define ('FORMAT_DB_DATE', 'Y-m-d');