Дополнительно
Как вычислить возраст человека на C#?
Учитывая DateTime
, представляющий день рождения человека, как вычислить его возраст в годах?
1742
20
Понятное и простое решение.
Однако это предполагает, что вы ищете западное представление о возрасте, а не используете восточноазиатское летоисчисление.
Это странный способ сделать это, но если вы отформатируете дату в
yyyymmdd
и вычтете дату рождения из текущей даты, затем отбросите последние 4 цифры, вы получите возраст :)Я не знаю C#, но думаю, что это будет работать в любом языке.
Отбросить последние 4 цифры =
28
.Код на C#:
Или, как вариант, без приведения типов в виде метода расширения. Проверка ошибок опущена:
Я не знаю, как может быть принято неправильное решение. Правильный сниппет на C# был написан Майклом Штумом.
Вот тестовый фрагмент:
Здесь есть методы:
Я не'т думаю, что любой из ответов до сих пор предоставить для культур, которые вычисляют возраст по-разному. См., например, Восточной Азии возраст расплаты против что на Западе.
Какие реальные ответ должен включать локализации. Шаблоне стратегия, вероятно, будет в порядке в этом примере.
Простым ответом на этот вопрос является применение
AddYears
, как показано ниже, поскольку это единственный собственный метод, позволяющий прибавить годы к 29-му февраля високосного года и получить правильный результат 28-го февраля для обычных лет.Некоторые считают, что 1 марта является днем рождения високосных годов, но ни .Net, ни какие-либо официальные правила не поддерживают этого, равно как и обычная логика не объясняет, почему некоторые люди, родившиеся в феврале, должны иметь 75% своих дней рождения в другом месяце.
Далее, метод Age может быть добавлен в качестве расширения к
DateTime
. С его помощью вы можете получить возраст самым простым способом:int age = birthDate.Age();.
Теперь выполните этот тест:
Пример критической даты выглядит следующим образом:
Дата рождения: 2000-02-29 Поздняя дата: 2011-02-28 Возраст: 11.
Вывод:
И для более поздней даты 2012-02-28:
Мое предложение
Что, кажется, год меняется на правильную дату. (Я месте протестировано до возраста 107)
Еще одна функция, не моя, но найденная в Интернете и немного усовершенствованная:
Только две вещи, которые приходят мне в голову: Как насчет людей из стран, которые не используют григорианский календарь? DateTime.Now находится в культуре, специфичной для сервера, я думаю. У меня нет абсолютно никаких знаний о работе с азиатскими календарями, и я не знаю, есть ли простой способ конвертации дат между календарями, но на всякий случай, если вы'задаетесь вопросом о тех китайских парнях из 4660 года :-)
2 основные проблемы для решения:
1. Рассчитайте точный возраст - в годах, месяцах, днях и т. д.
2. Расчета, как правило, воспринимается возраст - люди, как правило, не волнует, сколько лет у них точно есть, они просто заботятся, когда их день рождения в текущем году.
Решение для 1 очевидно:
Решение для 2 это не так точны в определении общий возраст, но воспринимается как точные люди. Люди часто используют его, когда они вычисляют их возраст и"вручную" и:
Примечания к 2.:
Просто еще одно замечание ... я бы создал 2 статических перегруженных методов для него, один для универсального использования, второй для использования удобство:
Я опоздал на вечеринку, но здесь'ы один-лайнер:
Это версия, мы используем здесь. Это работает, и это'ы довольно проста. Это'с такой же идеей, как Джефф's, но я думаю, что это's немного понятнее, потому что он отделяет логику вычитания, поэтому он's немного легче понять.
Вы могли бы расширить тернарного оператора, чтобы сделать его еще более четким, если вы считаете, что то, что непонятно.
Очевидно, это сделано как метод расширения
Датавремя
, но очевидно, что вы можете захватить, что одна строка кода, которая делает работу и поместить его в любом месте. Здесь мы имеем другую перегрузку метода расширения, который проходит в `Датавремя.Теперь, просто для полноты.Лучший способ, который я знаю из-за високосного года и всего остального:
Надеюсь, это поможет.
Я использую этот:
Это дает мне "поподробнее" на этот вопрос. Может быть, это то, что вы'вновь ищу
Я создал пользователя SQL-сервера функция, определяемая для расчета кто-то's возраст, учитывая их дату рождения. Это полезно, когда вам нужно его как часть запроса:
Здесь'ы еще один ответ:
Это была широкая тестирования. Это выглядит немного как "Магия и". Номер 372-это количество дней будет в год, если каждый месяц имеет 31 день.
Объяснение, почему это работает (поднял здесь) является:
> и, следовательно,
(31*(МН - МВ) + (дн - дБ)) / 372 = 0
Я'вэ провел некоторое время, работая над этим и придумал это, чтобы вычислить кого-то's возраст в годах, месяцах и днях. Я'вэ проверку в отношении 29-й проблемы и високосный год февраля и это, кажется, работает, я'd не ценим любую обратную связь:
Мы должны рассматривать людей, которые меньше, чем 1 год? в качестве китайская культура, мы описываем маленькие дети' возрасте 2 месяца или 4 недели.
Ниже моя реализация, это не так просто, как я себе представляла, особенно для борьбы с датой, как 2/28.
Эта реализация прошла ниже тестов.
Надеюсь, что это's полезн.
Держать его простым (и, возможно, глупый:)).
Я'м не знаете, как точно вы'd, как он вернулся к вам, поэтому я просто сделал читаемую строку.
Самый простой способ я'ве когда-либо найденных это. Он работает правильно для США и Западной Европы районов. Может'т поговорить с других районов, особенно в таких местах, как Китай. 4 дополнительных сравнивает, в крайнем случае, после первоначального расчета возраст.
Я искал ответы на этот и заметил, что никто не сослался на нормативно-правовые последствия високосного дня рождения. Например, в Википедии, Если вы'заново родился 29 февраля в различных юрисдикциях, вы'вновь невисокосный год рождения варьируется:
И насколько я могу судить, в США, законы молчат по этому вопросу, оставив его на общем праве и на то, как различные регулирующие органы определяют в их правилах.
С этой целью улучшение:
Следует отметить, что в этом коде предполагается: