Comment puis-je calculer l'âge de quelqu'un en C #?

Étant donné un DateTime représentant l'anniversaire d'une personne, comment calculer son âge en années?

0
ajouté édité
Vues: 29
@Yaur: Il suffit de convertir le temps d'aujourd'hui + naissance en GMT / UTC, l'âge est seulement une valeur relative, donc les fuseaux horaires sont hors de propos. Pour déterminer le fuseau horaire actuel de l'utilisateur, vous pouvez utiliser GeoLocating.
ajouté l'auteur Stefan Steiger, source
Pourquoi ne pas considérer [Date Julian] [1]? [1]: stackoverflow.com/questions/7103064/…
ajouté l'auteur Muhammad Hewedy, source
ce que toutes les réponses ont jusqu'ici manqué est que cela dépend où la personne est née et où ils sont en ce moment.
ajouté l'auteur Yaur, source
Notez que pour une personne de moins d'un an, son âge est donné en jours, semaines ou mois. Le temps de transition pour les unités peut être spécifique au domaine.
ajouté l'auteur Andrew Morton, source
pourquoi personne n'utilise TimeSpan?
ajouté l'auteur Arijit Mukherjee, source
Si nous prenons en compte la suggestion de @Yaur de calculs de fuseau horaire croisé, est-ce que le Day Light Saving Time devrait affecter le calcul de quelque manière que ce soit?
ajouté l'auteur DDM, source
Personne n'a considéré les années bissextiles? ou vérifier le mois?
ajouté l'auteur Crash Override, source

7 Réponses

Il y a de nombreuses années, pour fournir un gimmick calculateur d'âge sur mon site, j'ai écrit une fonction pour calculer l'âge à un fraction. C'est un port rapide de cette fonction à C# (de le Version PHP ). Je crains de ne pas avoir pu tester la version C#, mais j'espère que vous apprécierez tout de même!

(Certes, c'est un peu gadget dans le but de montrer des profils d'utilisateurs sur Stack Overflow, mais peut-être que les lecteurs trouveront une utilité pour cela :-))

double AgeDiff(DateTime date1, DateTime date2) {
    double years = date2.Year - date1.Year;

    /*
     * If date2 and date1 + round(date2 - date1) are on different sides
     * of 29 February, then our partial year is considered to have 366
     * days total, otherwise it's 365. Note that 59 is the day number
     * of 29 Feb.
     */
    double fraction = 365
            + (DateTime.IsLeapYear(date2.Year) && date2.DayOfYear >= 59
            && (date1.DayOfYear < 59 || date1.DayOfYear > date2.DayOfYear)
            ? 1 : 0);

    /*
     * The only really nontrivial case is if date1 is in a leap year,
     * and date2 is not. So let's handle the others first.
     */
    if (DateTime.IsLeapYear(date2.Year) == DateTime.IsLeapYear(date1.Year))
        return years + (date2.DayOfYear - date1.DayOfYear) / fraction;

    /*
     * If date2 is in a leap year, but date1 is not and is March or
     * beyond, shift up by a day.
     */
    if (DateTime.IsLeapYear(date2.Year)) {
        return years + (date2.DayOfYear - date1.DayOfYear
                - (date1.DayOfYear >= 59 ? 1 : 0)) / fraction;
    }

    /*
     * If date1 is not on 29 February, shift down date1 by a day if
     * March or later. Proceed normally.
     */
    if (date1.DayOfYear != 59) {
        return years + (date2.DayOfYear - date1.DayOfYear
                + (date1.DayOfYear > 59 ? 1 : 0)) / fraction;
    }

    /*
     * Okay, here date1 is on 29 February, and date2 is not on a leap
     * year. What to do now? On 28 Feb in date2's year, the ``age''
     * should be just shy of a whole number, and on 1 Mar should be
     * just over. Perhaps the easiest way is to a point halfway
     * between those two: 58.5.
     */
    return years + (date2.DayOfYear - 58.5) / fraction;
}
0
ajouté
C'est super. Bien que j'ai simplement utilisé des années astronomiques.
ajouté l'auteur IllidanS4, source

La meilleure façon que je connaisse à cause des années bissextiles et tout est:

DateTime birthDate = new DateTime(2000,3,1);
int age = (int)Math.Floor((DateTime.Now - birthDate).TotalDays / 365.25D);

J'espère que cela t'aides.

0
ajouté

Une autre fonction, pas par moi mais trouvée sur le web et affinée un peu:

public static int GetAge(DateTime birthDate)
{
    DateTime n = DateTime.Now; // To avoid a race condition around midnight
    int age = n.Year - birthDate.Year;

    if (n.Month < birthDate.Month || (n.Month == birthDate.Month && n.Day < birthDate.Day))
        age--;

    return age;
}

Juste deux choses qui me viennent à l'esprit: Qu'en est-il des gens de pays qui n'utilisent pas le calendrier grégorien? DateTime.Now est dans la culture spécifique au serveur, je pense. Je n'ai absolument aucune connaissance sur le fait de travailler avec les calendriers asiatiques et je ne sais pas s'il existe un moyen facile de convertir les dates entre les calendriers, mais juste au cas où vous vous poseriez des questions sur les chinois de l'année 4660 :-)

0
ajouté
Cela semble gérer les différentes régions (formats de date) les meilleurs.
ajouté l'auteur webdad3, source

Je ne pense pas que l'une des réponses à ce jour fournisse des cultures qui calculent l'âge différemment. Voir, par exemple, Reckoning de l'Asie de l'Est par rapport à celui de l'Ouest.

Toute réponse réelle doit inclure la localisation. Le schéma de stratégie serait probablement en ordre dans cet exemple.

0
ajouté
@some - Les Coréens utilisent encore ce système principalement.
ajouté l'auteur Justin L., source
En fait, ce concept peut être très important - les gens n'aiment pas être mal informés de leurs informations personnelles. À titre d'exemple, la moitié de ma famille vit en Malaisie et la moitié au Royaume-Uni. En ce moment, mon âge est considéré deux ans plus haut quand je suis avec un côté de ma famille qu'avec l'autre.
ajouté l'auteur Phil Gan, source
De l'article wikipedia que vous avez fourni: "En Chine et au Japon, il est utilisé pour la divination ou la religion traditionnelle, et il disparaît dans la vie quotidienne entre les peuples de la ville."
ajouté l'auteur some, source
Non seulement nous ce système utilisé principalement en Corée, mais en tant que touriste discutant des âges avec les habitants, les habitants se réfèrent poliment à soi-même l'un l'autre par leur année de naissance. Je n'ai pas 25 ans, j'ai 87 ans. J'aime mieux cette approche. plus d'un 'format international de naissance'
ajouté l'auteur Dean Rather, source
Même en Corée, alors que ce système est couramment utilisé dans les conversations informelles, à des fins juridiques (comme, par exemple, l'âge de boire), le comptage occidental est utilisé. Donc, je pense que simplement basculer un changement de culture est une très bonne façon de faire des choses que vous n'avez pas l'intention de faire.
ajouté l'auteur Casey, source

C'est une façon étrange de le faire, mais si vous formatez la date à yyyymmdd et soustrayez la date de naissance de la date actuelle, puis supprimez les 4 derniers chiffres que vous avez l'âge :)

Je ne connais pas C#, mais je crois que cela fonctionnera dans n'importe quelle langue.

20080814 - 19800703 = 280111 

Déposez les 4 derniers chiffres = 28 .

Code C #:

int now = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
int dob = int.Parse(dateOfBirth.ToString("yyyyMMdd"));
int age = (now - dob) / 10000;

Ou alternativement sans toute la conversion de type sous la forme d'une méthode d'extension. Erreur lors de la vérification omise:

public static Int32 GetAge(this DateTime dateOfBirth)
{
    var today = DateTime.Today;

    var a = (today.Year * 100 + today.Month) * 100 + today.Day;
    var b = (dateOfBirth.Year * 100 + dateOfBirth.Month) * 100 + dateOfBirth.Day;

    return (a - b) / 10000;
}
0
ajouté
Il vaudrait mieux ajouter un paramètre: float.Parse (x, CultureInfo.InvariantCulture) car certains locaux utilisent une virgule au lieu d'un point pour un délimiteur en nombres fractionnaires.
ajouté l'auteur krvladislav, source
poser une question pour une très ancienne publication int age = (maintenant - dob) / 10000; pourquoi vous soustrayez 10000?
ajouté l'auteur Monojit Sarkar, source
L'année DateTime.MaxValue est 9999, l'année MinValue est 1, le débordement n'est pas possible.
ajouté l'auteur Antonín Lejsek, source
En fait, cela est idéal pour une utilisation sur MS-SQL avec des champs de date-heure (nombre total de jours depuis 01-011900)
ajouté l'auteur Patrik Eckebrecht, source
@numerek S'il vous plaît poster vos modifications suggérées comme leur propre réponse. Pour ce que ça vaut, l'année en cours 10000 est loin d'être un débordement d'entier, de deux ordres de grandeur. 20.150.000 contre 2.147.483.648
ajouté l'auteur GalacticCowboy, source
Horray pour yyyymmdd . Le 1er produit de base de données que j'ai utilisé sur un ordinateur P personnel C (vers 1981) stockait des dates dans ce format. La manipulation de date de toute sorte était tellement plus facile.
ajouté l'auteur radarbob, source
dans votre réponse alternative, vous pouvez éviter le débordement d'entier en soustrayant les années puis soustraire le mois * 30.5 + jour et diviser par 366
ajouté l'auteur numerek, source
Cette réponse suppose que les bébés béants ont leurs anniversaires le 1er mars pour les années non bissextiles.
ajouté l'auteur Jamie Kitson, source

Une solution facile à comprendre et simple.

// Save today's date.
var today = DateTime.Today;
// Calculate the age.
var age = today.Year - birthdate.Year;
// Go back to the year the person was born in case of a leap year
if (birthdate > today.AddYears(-age)) age--;

Cependant, ceci suppose que vous êtes à la recherche de l'idée de l'âge western et que vous n'utilisez pas Reckoning d'Asie de l'Est .

0
ajouté
@JAG: DateTime.Today devrait être encore plus rapide.
ajouté l'auteur Shimmy, source
Ce code ne calcule pas l'âge le plus proche. Voici le code: var ts = DateTime.Now - new DateTime (1988, 3, 19); var age = Math.Round (ts.Days / 365,0);
ajouté l'auteur Dhaval Panchal, source
Je ne peux plus éditer mon commentaire, voici donc ma correction: TimeSpan difference = subject.Birthday - DateTime.Now; int age = difference.Days; Si vous voulez l'âge en années, vous pouvez toujours ajouter int ageInYears = age / 365;
ajouté l'auteur Nolonar, source
Ne serait-il plus facile de le faire DateTime DateDifference = subject.Birthday - DateTime.Now; int age = dateDifférence.Année; ? De plus, je ne pense pas que l'âge dépende des années bissextiles. Après tout, un an est défini comme 365 <366 jours, les années bissextiles ne vous font pas un jour plus jeune.
ajouté l'auteur Nolonar, source
Ou faites juste si (BirthDate.DayOfYear> Today.DayOfYear); pas besoin de modifier les variables de date
ajouté l'auteur NKCSS, source
@Danvil, est-ce vraiment mal? Prenons un exemple plus simple. Anniversaire = 2000/02/29, Aujourd'hui = 2001/02/28. Jours écoulés: 365. N'est-ce pas une année et, par conséquent, n'est pas la personne d'un an le 28? Ou est la définition d'une année 365-1 / 4 jours? Je dis juste que c'est compliqué.
ajouté l'auteur devuxer, source
La dernière ligne m'a fait trop réfléchir. Au lieu de cela, que diriez-vous: if (bday.AddYears (âge)> maintenant) age--; Cela semble être une expression plus intuitive.
ajouté l'auteur cdiggins, source
Le concept de mesure de l'âge en années est juste un mensonge dégoûtant parce qu'il ne tient pas compte des années bissextiles. Nous devrions mesurer l'âge en jours.
ajouté l'auteur Melbourne Developer, source
@Legends Il fait plus d'hypothèses que ce qui a été souligné dans la réponse, et c'est correct pour votre cas si et seulement si ces hypothèses sont valables pour votre cas. Sans connaître votre cas, il est impossible pour quelqu'un d'autre que vous de transformer cela en une réponse par oui ou par non.
ajouté l'auteur hvd, source
@ LukeTO'Brien La partie if (bday> today.AddYears (-age)) âge;; de cette réponse est censée en prendre soin. age serait 10 à ce moment-là en fonction de la différence des numéros d'année. Si l'anniversaire (décembre 1990) est postérieur à 10 ans (ce qui serait le mois de mars 1990), ce qui est le cas, alors age est décrémenté en 9 . Êtes-vous en train de dire que cela ne fonctionne pas pour vous?
ajouté l'auteur hvd, source
Est-ce que cette solution ci-dessus avec plus de 1400 upvotes correct, parce que je peux lire dans la section des commentaires qu'il y a quelques problèmes avec cette solution ...?
ajouté l'auteur Legends, source
Cette réponse ne tient pas compte du mois - Si je suis né en décembre 1990 et aujourd'hui en mars 2000, mon âge est de 9 ans et non de 10 ans car je n'ai pas encore eu mon anniversaire
ajouté l'auteur Luke T O'Brien, source
Nous avons donc un âge différent selon les pays et le calendrier? Quel scoop ...
ajouté l'auteur e-satis, source
@LarsD "Plusieurs pays ont sauté les dates après la naissance des personnes vivantes" <- Que voulez-vous dire?
ajouté l'auteur cja, source
@Rob Je suppose que tu as raison, mais c'est une question de précision, d'habitude ton anniversaire compte comme n'importe quand entre 00:00 et 23:59:59 un jour précis.
ajouté l'auteur Tristan Warner-Smith, source
Étant donné que nous parlons des anniversaires, vous pouvez simplement utiliser DateTime.Today étant donné que la partie horaire n'a aucune pertinence.
ajouté l'auteur Tristan Warner-Smith, source
Quick Fun Fact: Cette réponse a été présentée dans ce cours de pluralsight , Module 5 - Chapitre 3.
ajouté l'auteur displayName, source
Cette solution est-elle également à la recherche de mois? Sinon, il pourrait +/- 1 année
ajouté l'auteur alpham8, source
@cja - Cela signifie que certains pays ont fait des funnies il y a quelques années pour synchroniser les calendriers et supprimer les différences! en.wikipedia.org/wiki/Gregorian_calendar peut parler plus à ce sujet, je n'ai pas entièrement lis. La référence à 'Current People' est simplement de dire que les ajustements se sont produits au 20ème siècle (1901-2000). Beaucoup de gens sont encore vivants de cette période! :)
ajouté l'auteur bPratik, source
pourquoi ne pas utiliser TimeSpan ?
ajouté l'auteur gldraphael, source
@NKCSS: Cela ne gère pas correctement l'année bissextile. Mes tests montrent que seulement if (bday> now.AddYears (-age)) fonctionne. Puisque DayOfYear renvoie 61 en 2012 et 60 en 2011 pour le 1er mars.
ajouté l'auteur Guvante, source
Cette réponse ne fonctionne pas avec tous les paramètres régionaux et tous les âges. Plusieurs pays ont sauté des dates après la naissance des personnes vivantes actuelles, y compris la Russie (1918), la Grèce (1924) et la Turquie (1926).
ajouté l'auteur Lars D, source
@LarsD donc ce que vous dites est qu'il n'y a aucun moyen de calculer l'âge des gens? Ordures. Ils ont foiré leur calendrier, ils peuvent s'adapter. Même si vous pouviez faire une bibliothèque pour calculer le calque croisé en fonction des paramètres régionaux, a) d'où vous procurez-vous cette information b) cela en vaut-il la peine?
ajouté l'auteur Gusdor, source
@ TristanWarner-Smith Eh bien, techniquement c'est le cas. Si vous êtes né le 1er janvier 1990 à 13 heures, vous êtes 0 au 1er janvier 12:59 1991, mais 1 à Jan 1er 13:01 1991.
ajouté l'auteur Rob, source
DateTime birthdate = new DateTime (2012, 11, 5); DateTime now = DateTime.Now; int ans = now.Year - date de naissance.Année; if (now.Month
ajouté l'auteur Shaik Raffi, source
En Angleterre et au Pays de Galles ou à Hong Kong, une personne née le 29 février aura légalement atteint 18 ans le 1er mars. Si elle est née à Taiwan, elle devient légalement 18 le 28 février, un jour plus tôt . ( Wikipedia ) Donc date de naissance.AddYears (age) > today et birthdate> today.AddYears (-age) sont corrects et incorrects, selon la juridiction.
ajouté l'auteur Daniel Liuzzi, source
Je voulais juste commenter les performances de DateTime.Now. Si vous n'avez pas besoin d'une valeur précise de fuseau horaire, utilisez DateTime.UtcNow c'est beaucoup plus rapide.
ajouté l'auteur JAG, source
int age = DateTime.Today.Year - bday.Year; age = bday> DateTime.Today.AddYears (-age))? âge--: âge;
ajouté l'auteur Travis, source
Bonne idée cdiggins, mais ça ne marche pas comme bday.AddYears (âge) quand l'âge est 2/29 revient 2/28 sur les années qui ne sont pas bissextile ... continuer à essayer
ajouté l'auteur Mike Polen, source
En fait, ce n'est pas tout à fait correct. Ce code présume que 'bday' est la partie date d'un DateTime. C'est un casse-tête (je suppose que la plupart des gens vont simplement passer des dates et non des dates-heures), mais si vous passez un anniversaire comme date et heure où l'heure est supérieure à 00:00:00 alors vous ' Je courrai dans l'insecte que Danvil a signalé. Définir bday = bday.Date résout cela.
ajouté l'auteur Øyvind, source
@Rob Aux États-Unis, au moins, il est reconnu que le jour de votre naissance, peu importe le jour de votre naissance, vous êtes considéré comme l'âge suivant. Même si on est né à 23h59 le 1er janvier, lors de la fête du Nouvel An quand la balle tombe, tout le monde accepterait que votre âge ait changé même si vous êtes encore 24 heures avant l'heure de votre naissance. :) Légalement, on dit qu'un individu a aussi un an de plus pour son anniversaire. Que ce soit 16 à conduire, ou 21 à boire, ou 18 à voter. Peu importe à quelle heure vous êtes né. Le jour de votre anniversaire, vous avez un an d
ajouté l'auteur jfren484, source
votre dernière condition date de naissance> maintenant.AddYears (-age) était quelque chose que j'ai eu rapidement à cause de votre message !! Merci beaucoup
ajouté l'auteur Avdhut Vaidya, source

C'est la version que nous utilisons ici. Cela fonctionne, et c'est assez simple. C'est la même idée que celle de Jeff, mais je pense que c'est un peu plus clair parce que ça sépare la logique de la soustraction, donc c'est un peu plus facile à comprendre.

public static int GetAge(this DateTime dateOfBirth, DateTime dateAsAt)
{
    return dateAsAt.Year - dateOfBirth.Year - (dateOfBirth.DayOfYear < dateAsAt.DayOfYear ? 0 : 1);
}

Vous pourriez étendre l'opérateur ternaire pour le rendre encore plus clair, si vous pensez que ce genre de chose n'est pas clair.

Évidemment ceci est fait comme une méthode d'extension sur DateTime , mais clairement vous pouvez saisir cette ligne de code qui fait le travail et le mettre n'importe où. Ici, nous avons une autre surcharge de la méthode Extension qui passe dans DateTime.Now , juste pour l'exhaustivité.

0
ajouté
Je pense que cela peut être éteint par un jour où exactement un de dateOfBirth ou dateAsAt tombe dans une année bissextile. Considérons l'âge d'une personne née le 1er mars 2003 le 29 février 2004. Pour rectifier cela, vous devez faire une comparaison lexicographique des paires (Mois, JourDeMois) et l'utiliser pour le conditionnel.
ajouté l'auteur Doug McClean, source
ça ne va pas non plus montrer le bon âge à partir de ton anniversaire.
ajouté l'auteur dotjoe, source