Как рассчитать кого-то возраста в C #?

голоса
1k

Учитывая , DateTimeпредставляющий день рождения человека, как рассчитать свой возраст в годах?

Задан 01/08/2008 в 00:40
источник пользователем
На других языках...                            


64 ответов

голоса
1k

Легко понять и простое решение.

// 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--;

Однако, это предполагает , что вы ищете западную идею возраста , а не с помощью восточноазиатской расплаты .

Ответил 04/08/2008 d 17:50
источник пользователем

голоса
874

Это странный способ сделать это, но если отформатировать дату yyyymmddи вычесть дату рождения от текущей даты , то падение последней 4 цифры вы получили возраст :)

Я не знаю, C #, но я считаю, что это будет работать на любом языке.

20080814 - 19800703 = 280111 

Отбросьте последние 4 цифры = 28.

C # код:

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

Или же все без преобразования типов в виде методы расширения. Ошибка проверки опущена:

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;
}
Ответил 15/08/2008 d 04:47
источник пользователем

голоса
336

Я не знаю, как неправильное решение может быть принято. Правильный C # фрагмент был написан Майклом Штума

Вот тест фрагмент кода:

DateTime bDay = new DateTime(2000, 2, 29);
DateTime now = new DateTime(2009, 2, 28);
MessageBox.Show(string.Format("Test {0} {1} {2}",
                CalculateAgeWrong1(bDay, now),     // outputs 9
                CalculateAgeWrong2(bDay, now),     // outputs 9
                CalculateAgeCorrect(bDay, now)));  // outputs 8

Здесь у вас есть методы:

public int CalculateAgeWrong1(DateTime birthDate, DateTime now)
{
    return new DateTime(now.Subtract(birthDate).Ticks).Year - 1;
}

public int CalculateAgeWrong2(DateTime birthDate, DateTime now)
{
    int age = now.Year - birthDate.Year;

    if (now < birthDate.AddYears(age))
        age--;

    return age;
}

public int CalculateAgeCorrect(DateTime birthDate, DateTime now)
{
    int age = now.Year - birthDate.Year;

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

    return age;
}
Ответил 20/10/2009 d 16:07
источник пользователем

голоса
113

Я не думаю , что какое - либо из ответов до сих пор обеспечивает культуры , которые вычисляют возраст по- разному. Смотрите, например, в Восточной Азии Возраст Reckoning против , что на Западе.

Любой реальный ответ должен включать в себя локализацию. Шаблон стратегии , вероятно , будет в порядке в этом примере.

Ответил 17/08/2008 d 18:14
источник пользователем

голоса
98

Простой ответ на это , чтобы применять , AddYearsкак показано ниже , потому что это единственный нативный метод , чтобы добавить года к 29 февраля високосных лет и получить правильный результат 28 февраля на общие года.

Некоторые считают, что 1th на март дня рождения leaplings но ни .Net, ни какое-либо официальное правило поддерживает это, и не общая логика объясняет, почему некоторые родились в феврале должны иметь 75% от их рождения в другом месяце.

Кроме того, метод Возраст поддается быть добавлены в качестве расширения DateTime. Благодаря этому вы можете получить возраст наиболее простым способом:

  1. Элемент списка

ИНТ возраст = birthDate.Age ();

public static class DateTimeExtensions
{
    /// <summary>
    /// Calculates the age in years of the current System.DateTime object today.
    /// </summary>
    /// <param name="birthDate">The date of birth</param>
    /// <returns>Age in years today. 0 is returned for a future date of birth.</returns>
    public static int Age(this DateTime birthDate)
    {
        return Age(birthDate, DateTime.Today);
    }

    /// <summary>
    /// Calculates the age in years of the current System.DateTime object on a later date.
    /// </summary>
    /// <param name="birthDate">The date of birth</param>
    /// <param name="laterDate">The date on which to calculate the age.</param>
    /// <returns>Age in years on a later day. 0 is returned as minimum.</returns>
    public static int Age(this DateTime birthDate, DateTime laterDate)
    {
        int age;
        age = laterDate.Year - birthDate.Year;

        if (age > 0)
        {
            age -= Convert.ToInt32(laterDate.Date < birthDate.Date.AddYears(age));
        }
        else
        {
            age = 0;
        }

        return age;
    }
}

Теперь запустите этот тест:

class Program
{
    static void Main(string[] args)
    {
        RunTest();
    }

    private static void RunTest()
    {
        DateTime birthDate = new DateTime(2000, 2, 28);
        DateTime laterDate = new DateTime(2011, 2, 27);
        string iso = "yyyy-MM-dd";

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                Console.WriteLine("Birth date: " + birthDate.AddDays(i).ToString(iso) + "  Later date: " + laterDate.AddDays(j).ToString(iso) + "  Age: " + birthDate.AddDays(i).Age(laterDate.AddDays(j)).ToString());
            }
        }

        Console.ReadKey();
    }
}

Критический пример даты заключается в следующем:

Дата рождения: 2000-02-29 Позже дата: 2011-02-28 Возраст: 11

Вывод:

{
    Birth date: 2000-02-28  Later date: 2011-02-27  Age: 10
    Birth date: 2000-02-28  Later date: 2011-02-28  Age: 11
    Birth date: 2000-02-28  Later date: 2011-03-01  Age: 11
    Birth date: 2000-02-29  Later date: 2011-02-27  Age: 10
    Birth date: 2000-02-29  Later date: 2011-02-28  Age: 11
    Birth date: 2000-02-29  Later date: 2011-03-01  Age: 11
    Birth date: 2000-03-01  Later date: 2011-02-27  Age: 10
    Birth date: 2000-03-01  Later date: 2011-02-28  Age: 10
    Birth date: 2000-03-01  Later date: 2011-03-01  Age: 11
}

А для более позднего срока 2012-02-28:

{
    Birth date: 2000-02-28  Later date: 2012-02-28  Age: 12
    Birth date: 2000-02-28  Later date: 2012-02-29  Age: 12
    Birth date: 2000-02-28  Later date: 2012-03-01  Age: 12
    Birth date: 2000-02-29  Later date: 2012-02-28  Age: 11
    Birth date: 2000-02-29  Later date: 2012-02-29  Age: 12
    Birth date: 2000-02-29  Later date: 2012-03-01  Age: 12
    Birth date: 2000-03-01  Later date: 2012-02-28  Age: 11
    Birth date: 2000-03-01  Later date: 2012-02-29  Age: 11
    Birth date: 2000-03-01  Later date: 2012-03-01  Age: 12
}
Ответил 20/02/2011 d 00:56
источник пользователем

голоса
74

Мое предложение

int age = (int) ((DateTime.Now - bday).TotalDays/365.242199);

Это, кажется, есть изменение года на правом день. (I Точечный тестирование до возраста 107)

Ответил 03/10/2008 d 21:19
источник пользователем

голоса
61

Еще одна функция, а не мне, но нашел в Интернете и уточнена его немного:

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;
}

Всего две вещи, которые приходят мне в голову: А как насчет людей из стран, которые не используют григорианский календарь? DateTime.Now в культуре конкретного сервера я думаю. У меня есть абсолютно 0 знания о самом деле работаю с азиатскими календарями, и я не знаю, если есть простой способ преобразования даты между календарями, но только в том случае, если вам интересно об этих китайских ребята из года 4660 :-)

Ответил 01/08/2008 d 22:46
источник пользователем

голоса
43

2 Основные проблемы решить, являются:

1. Вычислить точный возраст - в годы, месяцы, дни и т.д.

2. Вычислить воспринималось возраст - люди , как правило , не волнует , сколько лет они точно, они просто заботятся , когда их день рождения в текущем году.


Раствор для 1 очевидна:

DateTime birth = DateTime.Parse("1.1.2000");
DateTime today = DateTime.Today;     //we usually don't care about birth time
TimeSpan age = today - birth;        //.NET FCL should guarantee this as precise
double ageInDays = age.TotalDays;    //total number of days ... also precise
double daysInYear = 365.2425;        //statistical value for 400 years
double ageInYears = ageInDays / daysInYear;  //can be shifted ... not so precise

Раствор для 2 является тот , который не настолько точен в определивших общий возраст, но воспринимается как точный людьми. Люди также обычно используют его, когда они вычисляют их возраст «вручную»:

DateTime birth = DateTime.Parse("1.1.2000");
DateTime today = DateTime.Today;
int age = today.Year - birth.Year;    //people perceive their age in years

if (today.Month < birth.Month ||
   ((today.Month == birth.Month) && (today.Day < birth.Day)))
{
  age--;  //birthday in current year not yet reached, we are 1 year younger ;)
          //+ no birthday for 29.2. guys ... sorry, just wrong date for birth
}

Примечания к 2 .:

  • Это мое предпочтительное решение
  • Мы не можем использовать DateTime.DayOfYear или TimeSpans, поскольку они смещаются число дней в високосные годы
  • Я поставил там немного больше строк для удобства чтения

Просто еще одна ноты ... Я хотел бы создать 2 статические перегруженные методы для этого, один для универсального использования, второго для использования удобства:

public static int GetAge(DateTime bithDay, DateTime today) 
{ 
  //chosen solution method body
}

public static int GetAge(DateTime birthDay) 
{ 
  return GetAge(birthDay, DateTime.Now);
}
Ответил 11/04/2011 d 15:47
источник пользователем

голоса
42

Я опоздал на вечеринку, но вот один вкладыш:

int age = new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year-1;
Ответил 18/05/2009 d 13:36
источник пользователем

голоса
32

Это версия, которую мы используем здесь. Она работает, и это довольно просто. Это та же идея, как Джефф, но я думаю, что это немного яснее, потому что она отделяет логику для вычитания одного, так что это немного легче понять.

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

Вы могли бы расширить тройной оператор, чтобы сделать его еще более ясной, если вы считаете, что такая вещь не ясна.

Очевидно , что это делается в качестве метода расширения на DateTime, но ясно , вы можете захватить , что одна строка кода , которая делает работу и поставить его в любом месте. Здесь мы имеем другую перегрузку метода расширения , который проходит в DateTime.Now, просто для полноты картины .

Ответил 06/08/2008 d 11:23
источник пользователем

голоса
31

Много лет назад, чтобы обеспечить калькулятор возрастного трюк на моем сайте, я написал функцию для вычисления возраста к фракции. Это быстрый порт этой функции на C # (от версии PHP ). Я боюсь , что я не был в состоянии проверить # версию C, но надеюсь , вам понравится все то же самое!

(Надо признать, что это немного трюком для целей показывая профилей пользователей на переполнение стека, но, возможно, читатели найдут некоторые используют для этого. :-))

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;
}
Ответил 01/08/2008 d 09:57
источник пользователем

голоса
29

Я использую это:

public static class DateTimeExtensions
{
    public static int Age(this DateTime birthDate)
    {
        return Age(birthDate, DateTime.Now);
    }

    public static int Age(this DateTime birthDate, DateTime offsetDate)
    {
        int result=0;
        result = offsetDate.Year - birthDate.Year;

        if (offsetDate.DayOfYear < birthDate.DayOfYear)
        {
              result--;
        }

        return result;
    }
}
Ответил 17/02/2010 d 14:32
источник пользователем

голоса
26

Это дает «более подробно» на этот вопрос. Может быть, это то, что вы ищете

DateTime birth = new DateTime(1974, 8, 29);
DateTime today = DateTime.Now;
TimeSpan span = today - birth;
DateTime age = DateTime.MinValue + span;

// Make adjustment due to MinValue equalling 1/1/1
int years = age.Year - 1;
int months = age.Month - 1;
int days = age.Day - 1;

// Print out not only how many years old they are but give months and days as well
Console.Write("{0} years, {1} months, {2} days", years, months, days);
Ответил 20/09/2013 d 20:13
источник пользователем

голоса
26

Лучший способ, который я знаю, из-за високосных лет, и все это:

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

Надеюсь это поможет.

Ответил 01/08/2008 d 13:07
источник пользователем

голоса
22

Я создал пользовательские функции SQL Server для вычисления чьего-то возраста, учитывая их дату рождения. Это полезно, когда вам это нужно, как часть запроса:

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [SqlFunction(DataAccess = DataAccessKind.Read)]
    public static SqlInt32 CalculateAge(string strBirthDate)
    {
        DateTime dtBirthDate = new DateTime();
        dtBirthDate = Convert.ToDateTime(strBirthDate);
        DateTime dtToday = DateTime.Now;

        // get the difference in years
        int years = dtToday.Year - dtBirthDate.Year;

        // subtract another year if we're before the
        // birth day in the current year
        if (dtToday.Month < dtBirthDate.Month || (dtToday.Month == dtBirthDate.Month && dtToday.Day < dtBirthDate.Day))
            years=years-1;

        int intCustomerAge = years;
        return intCustomerAge;
    }
};
Ответил 23/08/2008 d 14:58
источник пользователем

голоса
21

Я провел некоторое время, работая над этим и пришел с этим рассчитать кого-то возраста в годы, месяцы и дни. Я тестировал против февраля 29-й проблемой и високосных лет, и это, кажется, работает, я бы признателен за любую обратную связь:

public void LoopAge(DateTime myDOB, DateTime FutureDate)
{
    int years = 0;
    int months = 0;
    int days = 0;

    DateTime tmpMyDOB = new DateTime(myDOB.Year, myDOB.Month, 1);

    DateTime tmpFutureDate = new DateTime(FutureDate.Year, FutureDate.Month, 1);

    while (tmpMyDOB.AddYears(years).AddMonths(months) < tmpFutureDate)
    {
        months++;

        if (months > 12)
        {
            years++;
            months = months - 12;
        }
    }

    if (FutureDate.Day >= myDOB.Day)
    {
        days = days + FutureDate.Day - myDOB.Day;
    }
    else
    {
        months--;

        if (months < 0)
        {
            years--;
            months = months + 12;
        }

        days +=
            DateTime.DaysInMonth(
                FutureDate.AddMonths(-1).Year, FutureDate.AddMonths(-1).Month
            ) + FutureDate.Day - myDOB.Day;

    }

    //add an extra day if the dob is a leap day
    if (DateTime.IsLeapYear(myDOB.Year) && myDOB.Month == 2 && myDOB.Day == 29)
    {
        //but only if the future date is less than 1st March
        if (FutureDate >= new DateTime(FutureDate.Year, 3, 1))
            days++;
    }

}
Ответил 18/05/2009 d 12:24
источник пользователем

голоса
16

Нужно ли нам рассматривать людей, которые меньше, чем на 1 год? в китайской культуре, мы описываем возраст маленьких младенцев как 2 месяца или 4-х недель.

Ниже моя реализация, это не так просто, как то, что я представлял себе, особенно, чтобы иметь дело с датой, как 2/28.

public static string HowOld(DateTime birthday, DateTime now)
{
    if (now < birthday)
        throw new ArgumentOutOfRangeException("birthday must be less than now.");

    TimeSpan diff = now - birthday;
    int diffDays = (int)diff.TotalDays;

    if (diffDays > 7)//year, month and week
    {
        int age = now.Year - birthday.Year;

        if (birthday > now.AddYears(-age))
            age--;

        if (age > 0)
        {
            return age + (age > 1 ? " years" : " year");
        }
        else
        {// month and week
            DateTime d = birthday;
            int diffMonth = 1;

            while (d.AddMonths(diffMonth) <= now)
            {
                diffMonth++;
            }

            age = diffMonth-1;

            if (age == 1 && d.Day > now.Day)
                age--;

            if (age > 0)
            {
                return age + (age > 1 ? " months" : " month");
            }
            else
            {
                age = diffDays / 7;
                return age + (age > 1 ? " weeks" : " week");
            }
        }
    }
    else if (diffDays > 0)
    {
        int age = diffDays;
        return age + (age > 1 ? " days" : " day");
    }
    else
    {
        int age = diffDays;
        return "just born";
    }
}

Эта реализация прошла ниже тестов.

[TestMethod]
public void TestAge()
{
    string age = HowOld(new DateTime(2011, 1, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("1 year", age);

    age = HowOld(new DateTime(2011, 11, 30), new DateTime(2012, 11, 30));
    Assert.AreEqual("1 year", age);

    age = HowOld(new DateTime(2001, 1, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("11 years", age);

    age = HowOld(new DateTime(2012, 1, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("10 months", age);

    age = HowOld(new DateTime(2011, 12, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("11 months", age);

    age = HowOld(new DateTime(2012, 10, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("1 month", age);

    age = HowOld(new DateTime(2008, 2, 28), new DateTime(2009, 2, 28));
    Assert.AreEqual("1 year", age);

    age = HowOld(new DateTime(2008, 3, 28), new DateTime(2009, 2, 28));
    Assert.AreEqual("11 months", age);

    age = HowOld(new DateTime(2008, 3, 28), new DateTime(2009, 3, 28));
    Assert.AreEqual("1 year", age);

    age = HowOld(new DateTime(2009, 1, 28), new DateTime(2009, 2, 28));
    Assert.AreEqual("1 month", age);

    age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 3, 1));
    Assert.AreEqual("1 month", age);

    // NOTE.
    // new DateTime(2008, 1, 31).AddMonths(1) == new DateTime(2009, 2, 28);
    // new DateTime(2008, 1, 28).AddMonths(1) == new DateTime(2009, 2, 28);
    age = HowOld(new DateTime(2009, 1, 31), new DateTime(2009, 2, 28));
    Assert.AreEqual("4 weeks", age);

    age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 2, 28));
    Assert.AreEqual("3 weeks", age);

    age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 3, 1));
    Assert.AreEqual("1 month", age);

    age = HowOld(new DateTime(2012, 11, 5), new DateTime(2012, 11, 30));
    Assert.AreEqual("3 weeks", age);

    age = HowOld(new DateTime(2012, 11, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("4 weeks", age);

    age = HowOld(new DateTime(2012, 11, 20), new DateTime(2012, 11, 30));
    Assert.AreEqual("1 week", age);

    age = HowOld(new DateTime(2012, 11, 25), new DateTime(2012, 11, 30));
    Assert.AreEqual("5 days", age);

    age = HowOld(new DateTime(2012, 11, 29), new DateTime(2012, 11, 30));
    Assert.AreEqual("1 day", age);

    age = HowOld(new DateTime(2012, 11, 30), new DateTime(2012, 11, 30));
    Assert.AreEqual("just born", age);

    age = HowOld(new DateTime(2000, 2, 29), new DateTime(2009, 2, 28));
    Assert.AreEqual("8 years", age);

    age = HowOld(new DateTime(2000, 2, 29), new DateTime(2009, 3, 1));
    Assert.AreEqual("9 years", age);

    Exception e = null;

    try
    {
        age = HowOld(new DateTime(2012, 12, 1), new DateTime(2012, 11, 30));
    }
    catch (ArgumentOutOfRangeException ex)
    {
        e = ex;
    }

    Assert.IsTrue(e != null);
}

Надеюсь, что это полезно.

Ответил 30/11/2012 d 13:13
источник пользователем

голоса
15
TimeSpan diff = DateTime.Now - birthdayDateTime;
string age = String.Format("{0:%y} years, {0:%M} months, {0:%d}, days old", diff);

Я не уверен, как именно вы хотели бы он вернулся к вам, так что я просто сделал читаемую строку.

Ответил 19/09/2013 d 16:18
источник пользователем

голоса
15

Самый простой способ, которым я когда-либо нашел это. Он работает правильно для США и западных районов Европы. Не могу говорить с другими местами, особенно в таких места, как Китай. 4 экстра сравнивает, в лучшем случае, после первоначального расчета возраста.

public int AgeInYears(DateTime birthDate, DateTime referenceDate)
{
  Debug.Assert(referenceDate >= birthDate, 
               "birth date must be on or prior to the reference date");

  DateTime birth = birthDate.Date;
  DateTime reference = referenceDate.Date;
  int years = (reference.Year - birth.Year);

  //
  // an offset of -1 is applied if the birth date has 
  // not yet occurred in the current year.
  //
  if (reference.Month > birth.Month);
  else if (reference.Month < birth.Month) 
    --years;
  else // in birth month
  {
    if (reference.Day < birth.Day)
      --years;
  }

  return years ;
}

Я просматривал ответы на это , и заметил , что никто не сделал ссылку на нормативно / правовые последствия високосный день рождения. Так , например, в Википедии , если вы родились 29 февраля в различных юрисдикциях, вы не високосный год рождения меняется:

  • В Соединенном Королевстве и в Гонконге: это порядковый день года, поэтому на следующий день, 1 марта свой день рождения.
  • В Новой Зеландии: это в предыдущий день, 28 февраля в целях выдачи водительских прав, и 1 марта для других целей.
  • Тайвань: это 28 февраля.

И насколько я могу судить, в США, уставы молчат по этому вопросу, оставляя его до общего права и как различные регулирующие органы определяют вещи в их правилах.

С этой целью улучшение:

public enum LeapDayRule
{
  OrdinalDay     = 1 ,
  LastDayOfMonth = 2 ,
}

static int ComputeAgeInYears(DateTime birth, DateTime reference, LeapYearBirthdayRule ruleInEffect)
{
  bool isLeapYearBirthday = CultureInfo.CurrentCulture.Calendar.IsLeapDay(birth.Year, birth.Month, birth.Day);
  DateTime cutoff;

  if (isLeapYearBirthday && !DateTime.IsLeapYear(reference.Year))
  {
    switch (ruleInEffect)
    {
      case LeapDayRule.OrdinalDay:
        cutoff = new DateTime(reference.Year, 1, 1)
                             .AddDays(birth.DayOfYear - 1);
        break;

      case LeapDayRule.LastDayOfMonth:
        cutoff = new DateTime(reference.Year, birth.Month, 1)
                             .AddMonths(1)
                             .AddDays(-1);
        break;

      default:
        throw new InvalidOperationException();
    }
  }
  else
  {
    cutoff = new DateTime(reference.Year, birth.Month, birth.Day);
  }

  int age = (reference.Year - birth.Year) + (reference >= cutoff ? 0 : -1);
  return age < 0 ? 0 : age;
}

Следует отметить, что этот код предполагает:

  • Западный (европейский) расплата возраста, и
  • Календарь, как григорианский календарь, который вставляет один високосный день в конце месяца.
Ответил 06/10/2010 d 02:49
источник пользователем

голоса
15

Сохраняя это просто (и, возможно, глупо :)).

DateTime birth = new DateTime(1975, 09, 27, 01, 00, 00, 00);
TimeSpan ts = DateTime.Now - birth;
Console.WriteLine("You are approximately " + ts.TotalSeconds.ToString() + " seconds old.");
Ответил 18/08/2010 d 15:29
источник пользователем

голоса
14

Это один из наиболее точного ответа, который способен решить день рождения 29 февраля по сравнению с любым годом 28-го февраля

public int GetAge(DateTime birthDate)
{
    int age = DateTime.Now.Year - birthDate.Year;

    if (birthDate.DayOfYear > DateTime.Now.DayOfYear)
        age--;

    return age;
}
Ответил 23/10/2014 d 14:18
источник пользователем

голоса
13

Вот еще один ответ:

public static int AgeInYears(DateTime birthday, DateTime today)
{
    return ((today.Year - birthday.Year) * 372 + (today.Month - birthday.Month) * 31 + (today.Day - birthday.Day)) / 372;
}

Это было экстенсивно блок испытания. Это действительно выглядит немного «магии». Число 372 является количество дней было бы в течение года, если каждый месяц имел 31 дней.

Объяснение того , почему он работает ( снят здесь ) является:

Зададим Yn = DateTime.Now.Year, Yb = birthday.Year, Mn = DateTime.Now.Month, Mb = birthday.Month, Dn = DateTime.Now.Day, Db = birthday.Day

age = Yn - Yb + (31*(Mn - Mb) + (Dn - Db)) / 372

Мы знаем, что нам нужно , либо , Yn-Ybесли дата уже достигнута, Yn-Yb-1если она не имеет.

а) Если Mn<Mbмы имеем-341 <= 31*(Mn-Mb) <= -31 and -30 <= Dn-Db <= 30

-371 <= 31*(Mn - Mb) + (Dn - Db) <= -1

С целочисленного деления

(31*(Mn - Mb) + (Dn - Db)) / 372 = -1

б) Если Mn=Mbи Dn<Dbмы имеем31*(Mn - Mb) = 0 and -30 <= Dn-Db <= -1

С целочисленным делением, снова

(31*(Mn - Mb) + (Dn - Db)) / 372 = -1

в) Если Mn>Mbмы имеем31 <= 31*(Mn-Mb) <= 341 and -30 <= Dn-Db <= 30

1 <= 31*(Mn - Mb) + (Dn - Db) <= 371

С целочисленного деления

(31*(Mn - Mb) + (Dn - Db)) / 372 = 0

d) Если Mn=Mbи Dn>Dbмы имеем 31*(Mn - Mb) = 0 and 1 <= Dn-Db <= 30

С целочисленным делением, снова

(31*(Mn - Mb) + (Dn - Db)) / 372 = 0

е) Если Mn=Mbи Dn=Dbмы имеем31*(Mn - Mb) + Dn-Db = 0

и поэтому (31*(Mn - Mb) + (Dn - Db)) / 372 = 0

Ответил 22/04/2013 d 09:19
источник пользователем

голоса
13

Это не прямой ответ, но больше философских рассуждений о проблеме в стороны от квази-научной точки зрения.

Я считаю , что этот вопрос не определяет устройство , ни культуру , в котором для измерения возраста, большинство ответов , кажется, предполагают ежегодное представление целого числа. SI-единица времени second, Ergo правильный общий ответ должен быть (конечно , предполагающей нормализуется DateTimeи не принимая никакого отношения вообще релятивистских эффектов):

var lifeInSeconds = (DateTime.Now.Ticks - then.Ticks)/TickFactor;

В христианском пути вычисления возраста в годах:

var then = ... // Then, in this case the birthday
var now = DateTime.UtcNow;
int age = now.Year - then.Year;
if (now.AddYears(-age) < then) age--;

В финансах существует аналогичная проблема при расчете что - то часто упоминается как день Графа фракции , что примерно составляет несколько лет за определенный период. И вопрос возраста действительно измерения времени вопрос.

Пример для фактической / фактической (считая все дни «правильно») конвенции:

DateTime start, end = .... // Whatever, assume start is before end

double startYearContribution = 1 - (double) start.DayOfYear / (double) (DateTime.IsLeapYear(start.Year) ? 366 : 365);
double endYearContribution = (double)end.DayOfYear / (double)(DateTime.IsLeapYear(end.Year) ? 366 : 365);
double middleContribution = (double) (end.Year - start.Year - 1);

double DCF = startYearContribution + endYearContribution + middleContribution;

Другой весьма распространенный способ измерения времени, как правило, является «сериализации» (чувак, который назвал эту дату конвенции должны серьезно были Trippin'):

DateTime start, end = .... // Whatever, assume start is before end
int days = (end - start).Days;

Интересно, как долго мы должны идти, прежде чем релятивистская возраст в секундах становится более полезным, чем грубое приближение земными вокруг-солнечных циклов в течение жизни до сих пор :) Или, другими словами, когда период должны быть предоставлены местоположение или функция, представляющая движение для себя, чтобы быть действительным :)

Ответил 23/11/2012 d 16:00
источник пользователем

голоса
13

Вот решение.

DateTime dateOfBirth = new DateTime(2000, 4, 18);
DateTime currentDate = DateTime.Now;

int ageInYears = 0;
int ageInMonths = 0;
int ageInDays = 0;

ageInDays = currentDate.Day - dateOfBirth.Day;
ageInMonths = currentDate.Month - dateOfBirth.Month;
ageInYears = currentDate.Year - dateOfBirth.Year;

if (ageInDays < 0)
{
    ageInDays += DateTime.DaysInMonth(currentDate.Year, currentDate.Month);
    ageInMonths = ageInMonths--;

    if (ageInMonths < 0)
    {
        ageInMonths += 12;
        ageInYears--;
    }
}

if (ageInMonths < 0)
{
    ageInMonths += 12;
    ageInYears--;
}

Console.WriteLine("{0}, {1}, {2}", ageInYears, ageInMonths, ageInDays);
Ответил 18/06/2009 d 11:35
источник пользователем

голоса
12

Как об этом решении?

static string CalcAge(DateTime birthDay)
{
    DateTime currentDate = DateTime.Now;         
    int approximateAge = currentDate.Year - birthDay.Year;
    int daysToNextBirthDay = (birthDay.Month * 30 + birthDay.Day) - 
        (currentDate.Month * 30 + currentDate.Day) ;

    if (approximateAge == 0 || approximateAge == 1)
    {                
        int month =  Math.Abs(daysToNextBirthDay / 30);
        int days = Math.Abs(daysToNextBirthDay % 30);

        if (month == 0)
            return "Your age is: " + daysToNextBirthDay + " days";

        return "Your age is: " + month + " months and " + days + " days"; ;
    }

    if (daysToNextBirthDay > 0)
        return "Your age is: " + --approximateAge + " Years";

    return "Your age is: " + approximateAge + " Years"; ;
}
Ответил 08/03/2011 d 08:25
источник пользователем

голоса
11

У меня есть настроенный метод вычисления возраста, а также сообщение проверки бонуса только в случае, если это помогает:

public void GetAge(DateTime dob, DateTime now, out int years, out int months, out int days)
{
    years = 0;
    months = 0;
    days = 0;

    DateTime tmpdob = new DateTime(dob.Year, dob.Month, 1);
    DateTime tmpnow = new DateTime(now.Year, now.Month, 1);

    while (tmpdob.AddYears(years).AddMonths(months) < tmpnow)
    {
        months++;
        if (months > 12)
        {
            years++;
            months = months - 12;
        }
    }

    if (now.Day >= dob.Day)
        days = days + now.Day - dob.Day;
    else
    {
        months--;
        if (months < 0)
        {
            years--;
            months = months + 12;
        }
        days += DateTime.DaysInMonth(now.AddMonths(-1).Year, now.AddMonths(-1).Month) + now.Day - dob.Day;
    }

    if (DateTime.IsLeapYear(dob.Year) && dob.Month == 2 && dob.Day == 29 && now >= new DateTime(now.Year, 3, 1))
        days++;

}   

private string ValidateDate(DateTime dob) //This method will validate the date
{
    int Years = 0; int Months = 0; int Days = 0;

    GetAge(dob, DateTime.Now, out Years, out Months, out Days);

    if (Years < 18)
        message =  Years + " is too young. Please try again on your 18th birthday.";
    else if (Years >= 65)
        message = Years + " is too old. Date of Birth must not be 65 or older.";
    else
        return null; //Denotes validation passed
}

Метод вызов здесь и пройти значение даты и времени (ММ / дд / гггг, если сервер набор в США локалью). Заменить это ни с чем в MessageBox или любой контейнер для отображения:

DateTime dob = DateTime.Parse("03/10/1982");  

string message = ValidateDate(dob);

lbldatemessage.Visible = !StringIsNullOrWhitespace(message);
lbldatemessage.Text = message ?? ""; //Ternary if message is null then default to empty string

Помните, что вы можете форматировать сообщение так, как вам нравится.

Ответил 22/01/2014 d 08:23
источник пользователем

голоса
10
private int GetAge(int _year, int _month, int _day
{
    DateTime yourBirthDate= new DateTime(_year, _month, _day);

    DateTime todaysDateTime = DateTime.Today;
    int noOfYears = todaysDateTime.Year - yourBirthDate.Year;

    if (DateTime.Now.Month < yourBirthDate.Month ||
        (DateTime.Now.Month == yourBirthDate.Month && DateTime.Now.Day < yourBirthDate.Day))
    {
        noOfYears--;
    }

    return  noOfYears;
}
Ответил 06/09/2010 d 15:09
источник пользователем

голоса
8

SQL версии:

declare @dd smalldatetime = '1980-04-01'
declare @age int = YEAR(GETDATE())-YEAR(@dd)
if (@dd> DATEADD(YYYY, -@age, GETDATE())) set @age = @age -1

print @age  
Ответил 30/06/2016 d 11:24
источник пользователем

голоса
8

Я использовал решение ScArcher2 для точного расчета Года в возрасте человека, но мне нужно, чтобы принять его дальше и рассчитать свои месяцы и дни вместе с годами.

    public static Dictionary<string,int> CurrentAgeInYearsMonthsDays(DateTime? ndtBirthDate, DateTime? ndtReferralDate)
    {
        //----------------------------------------------------------------------
        // Can't determine age if we don't have a dates.
        //----------------------------------------------------------------------
        if (ndtBirthDate == null) return null;
        if (ndtReferralDate == null) return null;

        DateTime dtBirthDate = Convert.ToDateTime(ndtBirthDate);
        DateTime dtReferralDate = Convert.ToDateTime(ndtReferralDate);

        //----------------------------------------------------------------------
        // Create our Variables
        //----------------------------------------------------------------------
        Dictionary<string, int> dYMD = new Dictionary<string,int>();
        int iNowDate, iBirthDate, iYears, iMonths, iDays;
        string sDif = "";

        //----------------------------------------------------------------------
        // Store off current date/time and DOB into local variables
        //---------------------------------------------------------------------- 
        iNowDate = int.Parse(dtReferralDate.ToString("yyyyMMdd"));
        iBirthDate = int.Parse(dtBirthDate.ToString("yyyyMMdd"));

        //----------------------------------------------------------------------
        // Calculate Years
        //----------------------------------------------------------------------
        sDif = (iNowDate - iBirthDate).ToString();
        iYears = int.Parse(sDif.Substring(0, sDif.Length - 4));

        //----------------------------------------------------------------------
        // Store Years in Return Value
        //----------------------------------------------------------------------
        dYMD.Add("Years", iYears);

        //----------------------------------------------------------------------
        // Calculate Months
        //----------------------------------------------------------------------
        if (dtBirthDate.Month > dtReferralDate.Month)
            iMonths = 12 - dtBirthDate.Month + dtReferralDate.Month - 1;
        else
            iMonths = dtBirthDate.Month - dtReferralDate.Month;

        //----------------------------------------------------------------------
        // Store Months in Return Value
        //----------------------------------------------------------------------
        dYMD.Add("Months", iMonths);

        //----------------------------------------------------------------------
        // Calculate Remaining Days
        //----------------------------------------------------------------------
        if (dtBirthDate.Day > dtReferralDate.Day)
            //Logic: Figure out the days in month previous to the current month, or the admitted month.
            //       Subtract the birthday from the total days which will give us how many days the person has lived since their birthdate day the previous month.
            //       then take the referral date and simply add the number of days the person has lived this month.

            //If referral date is january, we need to go back to the following year's December to get the days in that month.
            if (dtReferralDate.Month == 1)
                iDays = DateTime.DaysInMonth(dtReferralDate.Year - 1, 12) - dtBirthDate.Day + dtReferralDate.Day;       
            else
                iDays = DateTime.DaysInMonth(dtReferralDate.Year, dtReferralDate.Month - 1) - dtBirthDate.Day + dtReferralDate.Day;       
        else
            iDays = dtReferralDate.Day - dtBirthDate.Day;             

        //----------------------------------------------------------------------
        // Store Days in Return Value
        //----------------------------------------------------------------------
        dYMD.Add("Days", iDays);

        return dYMD;
}
Ответил 12/08/2011 d 21:53
источник пользователем

голоса
6

Ничего себе, я должен был дать свой комментарий здесь .. Есть так много ответов на такой простой

private int CalcularIdade(DateTime dtNascimento)
    {
        var nHoje = Convert.ToInt32(DateTime.Today.ToString("yyyyMMdd"));
        var nAniversario = Convert.ToInt32(dtNascimento.ToString("yyyyMMdd"));

        double diff = (nHoje - nAniversario) / 10000;

        var ret = Convert.ToInt32(Math.Truncate(diff));

        return ret;
    }

Надеюсь, что это может помочь кому-то, по крайней мере, сделает кто-то думает .. :)

Ответил 29/09/2016 d 20:13
источник пользователем

голоса
6

Это самый простой способ, чтобы ответить на этот вопрос в одной строке.

DateTime Dob = DateTime.Parse("1985-04-24");

int Age = DateTime.MinValue.AddDays(DateTime.Now.Subtract(Dob).TotalHours/24).Year - 1;

Это также работает для високосных лет.

Ответил 27/04/2016 d 14:58
источник пользователем

голоса
6

Следующий подход (выдержка из Time Period библиотеки для .NET класса DateDiff ) рассматривает календарь инфо культуры:

// ----------------------------------------------------------------------
private static int YearDiff( DateTime date1, DateTime date2 )
{
  return YearDiff( date1, date2, DateTimeFormatInfo.CurrentInfo.Calendar );
} // YearDiff

// ----------------------------------------------------------------------
private static int YearDiff( DateTime date1, DateTime date2, Calendar calendar )
{
  if ( date1.Equals( date2 ) )
  {
    return 0;
  }

  int year1 = calendar.GetYear( date1 );
  int month1 = calendar.GetMonth( date1 );
  int year2 = calendar.GetYear( date2 );
  int month2 = calendar.GetMonth( date2 );

  // find the the day to compare
  int compareDay = date2.Day;
  int compareDaysPerMonth = calendar.GetDaysInMonth( year1, month1 );
  if ( compareDay > compareDaysPerMonth )
  {
    compareDay = compareDaysPerMonth;
  }

  // build the compare date
  DateTime compareDate = new DateTime( year1, month2, compareDay,
    date2.Hour, date2.Minute, date2.Second, date2.Millisecond );
  if ( date2 > date1 )
  {
    if ( compareDate < date1 )
    {
      compareDate = compareDate.AddYears( 1 );
    }
  }
  else
  {
    if ( compareDate > date1 )
    {
      compareDate = compareDate.AddYears( -1 );
    }
  }
  return year2 - calendar.GetYear( compareDate );
} // YearDiff

Применение:

// ----------------------------------------------------------------------
public void CalculateAgeSamples()
{
  PrintAge( new DateTime( 2000, 02, 29 ), new DateTime( 2009, 02, 28 ) );
  // > Birthdate=29.02.2000, Age at 28.02.2009 is 8 years
  PrintAge( new DateTime( 2000, 02, 29 ), new DateTime( 2012, 02, 28 ) );
  // > Birthdate=29.02.2000, Age at 28.02.2012 is 11 years
} // CalculateAgeSamples

// ----------------------------------------------------------------------
public void PrintAge( DateTime birthDate, DateTime moment )
{
  Console.WriteLine( "Birthdate={0:d}, Age at {1:d} is {2} years", birthDate, moment, YearDiff( birthDate, moment ) );
} // PrintAge
Ответил 13/05/2011 d 09:12
источник пользователем

голоса
5
    private int GetYearDiff(DateTime start, DateTime end)
    {
        int diff = end.Year - start.Year;
        if (end.DayOfYear < start.DayOfYear) { diff -= 1; }
        return diff;
    }
    [Fact]
    public void GetYearDiff_WhenCalls_ShouldReturnCorrectYearDiff()
    {
        //arrange
        var now = DateTime.Now;
        //act
        //assert
        Assert.Equal(24, GetYearDiff(new DateTime(1992, 7, 9), now)); // passed
        Assert.Equal(24, GetYearDiff(new DateTime(1992, now.Month, now.Day), now)); // passed
        Assert.Equal(23, GetYearDiff(new DateTime(1992, 12, 9), now)); // passed
    }
Ответил 22/10/2016 d 19:10
источник пользователем

голоса
5

=== Общие Выражения (от нескольких месяцев до лет) ===

Если только для общего пользования, вот код в качестве информации:

DateTime today = DateTime.Today;
DateTime bday = DateTime.Parse("2016-2-14");
int age = today.Year - bday.Year;
var unit = "";

if (bday > today.AddYears(-age))
{
    age--;
}
if (age == 0)   // Under one year old
{
    age = today.Month - bday.Month;

    age = age <= 0 ? (12 + age) : age;  // The next year before birthday

    age = today.Day - bday.Day >= 0 ? age : --age;  // Before the birthday.day

    unit = "month";
}
else {
    unit = "year";
}

if (age > 1)
{
    unit = unit + "s";
}

Результат теста, как показано ниже:

The birthday: 2016-2-14

2016-2-15 =>  age=0, unit=month;
2016-5-13 =>  age=2, unit=months;
2016-5-14 =>  age=3, unit=months; 
2016-6-13 =>  age=3, unit=months; 
2016-6-15 =>  age=4, unit=months; 
2017-1-13 =>  age=10, unit=months; 
2017-1-14 =>  age=11, unit=months; 
2017-2-13 =>  age=11, unit=months; 
2017-2-14 =>  age=1, unit=year; 
2017-2-15 =>  age=1, unit=year; 
2017-3-13 =>  age=1, unit=year;
2018-1-13 =>  age=1, unit=year; 
2018-1-14 =>  age=1, unit=year; 
2018-2-13 =>  age=1, unit=year; 
2018-2-14 =>  age=2, unit=years; 
Ответил 04/05/2016 d 08:29
источник пользователем

голоса
5

Это очень просто и, как представляется, быть точным для моих потребностей. Я делаю предположение для целей високосных лет, независимо от того, когда человек выбирает, чтобы отпраздновать день рождения, они не являются технически год старше до полных 365 дней прошли с тех пор там последний день рождения (то есть 28 февраля, не делает их в году старшая)

DateTime now = DateTime.Today;
DateTime birthday = new DateTime(1991, 02, 03);//3rd feb

int age = now.Year - birthday.Year;

if (now.Month < birthday.Month || (now.Month == birthday.Month && now.Day < birthday.Day))//not had bday this year yet
  age--;

return age;

Дайте нам знать, если вы заметили какие-либо проблемы;)

Ответил 24/02/2012 d 13:58
источник пользователем

голоса
4

Я сделал одно небольшое изменение в Марка SOEN в ответ: Я переписан третью строчку , так что выражение может быть разобран немного более легко.

public int AgeInYears(DateTime bday)
{
    DateTime now = DateTime.Today;
    int age = now.Year - bday.Year;            
    if (bday.AddYears(age) > now) 
        age--;
    return age;
}

Я также сделал его в функцию для наглядности.

Ответил 16/07/2011 d 19:01
источник пользователем

голоса
3
public string GetAge(this DateTime birthdate, string ageStrinFormat = null)
{
    var date = DateTime.Now.AddMonths(-birthdate.Month).AddDays(-birthdate.Day);
    return string.Format(ageStrinFormat ?? "{0}/{1}/{2}",
        (date.Year - birthdate.Year), date.Month, date.Day);
}
Ответил 12/10/2015 d 13:12
источник пользователем

голоса
3

Почему это не может быть это просто?

int age = DateTime.Now.AddTicks(0 - dob.Ticks).Year - 1;
Ответил 26/06/2015 d 16:00
источник пользователем

голоса
3

Этот классический вопрос заслуживает более Нода времени решения.

static int GetAge(LocalDate dateOfBirth)
{
    Instant now = SystemClock.Instance.Now;

    // The target time zone is important.
    // It should align with the *current physical location* of the person
    // you are talking about.  When the whereabouts of that person are unknown,
    // then you use the time zone of the person who is *asking* for the age.
    // The time zone of birth is irrelevant!

    DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/New_York"];

    LocalDate today = now.InZone(zone).Date;

    Period period = Period.Between(dateOfBirth, today, PeriodUnits.Years);

    return (int) period.Years;
}

Применение:

LocalDate dateOfBirth = new LocalDate(1976, 8, 27);
int age = GetAge(dateOfBirth);

Вы также можете быть заинтересованы в следующих улучшений:

  • Передача в часах как IClock, вместо использования SystemClock.Instance, позволит улучшить проверяемость.

  • Целевой часовой пояс, вероятно , изменится, так что вы бы хотите DateTimeZoneпараметр , как хорошо.

Смотрите также мой блог по этой теме: Обработка Дни рождения и другие юбилеи

Ответил 21/12/2013 d 05:53
источник пользователем

голоса
3

Вот DateTime расширитель, который добавляет расчет возраст для объекта DateTime.

public static class AgeExtender
{
    public static int GetAge(this DateTime dt)
    {
        int d = int.Parse(dt.ToString("yyyyMMdd"));
        int t = int.Parse(DateTime.Today.ToString("yyyyMMdd"));
        return (t-d)/10000;
    }
}
Ответил 20/05/2011 d 17:48
источник пользователем

голоса
2

Просто используйте:

(DateTime.Now - myDate).TotalHours / 8766.0

текущая дата - MyDate = TimeSpan, получить общее количество часов и разделить на общее количество часов в год и получить exacly возраста / месяцев / дней ...

Ответил 15/12/2017 d 17:27
источник пользователем

голоса
2

Я часто рассчитывать на пальцах. Мне нужно посмотреть календарь на работу, когда все меняется. Так вот что я буду делать в моем коде:

int AgeNow(DateTime birthday)
{
    return AgeAt(DateTime.Now, birthday);
}

int AgeAt(DateTime now, DateTime birthday)
{
    return AgeAt(now, birthday, CultureInfo.CurrentCulture.Calendar);
}

int AgeAt(DateTime now, DateTime birthday, Calendar calendar)
{
    // My age has increased on the morning of my 
    // birthday even though I was born in the evening.
    now = now.Date;
    birthday = birthday.Date;

    var age = 0;
    if (now <= birthday) return age; // I am zero now if I am to be born tomorrow.

    while (calendar.AddYears(birthday, age + 1) <= now)
    {
        age++;
    }
    return age;
}

Запуск этого через в LINQPad дает это:

PASSED: someone born on 28 February 1964 is age 4 on 28 February 1968
PASSED: someone born on 29 February 1964 is age 3 on 28 February 1968
PASSED: someone born on 31 December 2016 is age 0 on 01 January 2017

Код в LINQPad находится здесь

Ответил 16/07/2017 d 10:39
источник пользователем

голоса
2

Я использовал для этого вопроса, я знаю, это не очень элегантно, но он работает

DateTime zeroTime = new DateTime(1, 1, 1);
var date1 = new DateTime(1983, 03, 04);
var date2 = DateTime.Now;
var dif = date2 - date1;
int years = (zeroTime + dif).Year - 1;
Log.DebugFormat("Years -->{0}", years);
Ответил 05/10/2015 d 17:09
источник пользователем

голоса
2

Вот функция, которая служит мне хорошо ... Нет Calcs, очень просто.

    public static string ToAge(this DateTime dob, DateTime? toDate = null)
    {
        if (!toDate.HasValue)
            toDate = DateTime.Now;
        var now = toDate.Value;

        if (now.CompareTo(dob) < 0)
            return "Future date";

        int years = now.Year - dob.Year;
        int months = now.Month - dob.Month;
        int days = now.Day - dob.Day;

        if (days < 0)
        {
            months--;
            days = DateTime.DaysInMonth(dob.Year, dob.Month) - dob.Day + now.Day;
        }

        if (months < 0)
        {
            years--;
            months = 12 + months;
        }


        return string.Format("{0} year(s), {1} month(s), {2} days(s)",
            years,
            months,
            days);
    }

А вот тест блока:

    [Test]
    public void ToAgeTests()
    {
        var date = new DateTime(2000, 1, 1);
        Assert.AreEqual("0 year(s), 0 month(s), 1 days(s)", new DateTime(1999, 12, 31).ToAge(date));
        Assert.AreEqual("0 year(s), 0 month(s), 0 days(s)", new DateTime(2000, 1, 1).ToAge(date));
        Assert.AreEqual("1 year(s), 0 month(s), 0 days(s)", new DateTime(1999, 1, 1).ToAge(date));
        Assert.AreEqual("0 year(s), 11 month(s), 0 days(s)", new DateTime(1999, 2, 1).ToAge(date));
        Assert.AreEqual("0 year(s), 10 month(s), 25 days(s)", new DateTime(1999, 2, 4).ToAge(date));
        Assert.AreEqual("0 year(s), 10 month(s), 1 days(s)", new DateTime(1999, 2, 28).ToAge(date));

        date = new DateTime(2000, 2, 15);
        Assert.AreEqual("0 year(s), 0 month(s), 28 days(s)", new DateTime(2000, 1, 18).ToAge(date));
    }
Ответил 24/06/2015 d 11:26
источник пользователем

голоса
2

Я хочу добавить иврит календарь вычисления (или другой календарь System.Globalization может использоваться таким же образом), используя переписана функцию из этой темы:

Public Shared Function CalculateAge(BirthDate As DateTime) As Integer
    Dim HebCal As New System.Globalization.HebrewCalendar ()
    Dim now = DateTime.Now()
    Dim iAge = HebCal.GetYear(now) - HebCal.GetYear(BirthDate)
    Dim iNowMonth = HebCal.GetMonth(now), iBirthMonth = HebCal.GetMonth(BirthDate)
    If iNowMonth < iBirthMonth Or (iNowMonth = iBirthMonth AndAlso HebCal.GetDayOfMonth(now) < HebCal.GetDayOfMonth(BirthDate)) Then iAge -= 1
    Return iAge
End Function
Ответил 11/01/2012 d 09:58
источник пользователем

голоса
2

Вот небольшой пример кода для C # я залетела, будьте осторожны, вокруг края случаев, специально високосные годы, не все эти решения принимают их во внимание. Нажимать ответ, как в DateTime может вызвать проблемы, как вы могли бы в конечном итоге пытается поставить слишком много дней в конкретном месяце, например, 30 дней в феврале

public string LoopAge(DateTime myDOB, DateTime FutureDate)
{
    int years = 0;
    int months = 0;
    int days = 0;

    DateTime tmpMyDOB = new DateTime(myDOB.Year, myDOB.Month, 1);

    DateTime tmpFutureDate = new DateTime(FutureDate.Year, FutureDate.Month, 1);

    while (tmpMyDOB.AddYears(years).AddMonths(months) < tmpFutureDate)
    {
        months++;
        if (months > 12)
        {
            years++;
            months = months - 12;
        }
    }

    if (FutureDate.Day >= myDOB.Day)
    {
        days = days + FutureDate.Day - myDOB.Day;
    }
    else
    {
        months--;
        if (months < 0)
        {
            years--;
            months = months + 12;
        }
        days = days + (DateTime.DaysInMonth(FutureDate.AddMonths(-1).Year, FutureDate.AddMonths(-1).Month) + FutureDate.Day) - myDOB.Day;

    }

    //add an extra day if the dob is a leap day
    if (DateTime.IsLeapYear(myDOB.Year) && myDOB.Month == 2 && myDOB.Day == 29)
    {
        //but only if the future date is less than 1st March
        if(FutureDate >= new DateTime(FutureDate.Year, 3,1))
            days++;
    }

    return "Years: " + years + " Months: " + months + " Days: " + days;
}
Ответил 18/12/2009 d 15:55
источник пользователем

голоса
2

Будет ли это работать?

public override bool IsValid(DateTime value)
{
    _dateOfBirth =  value;
    var yearsOld = (double) (DateTime.Now.Subtract(_dateOfBirth).TotalDays/365);
    if (yearsOld > 18)
        return true;
    return false; 
}
Ответил 28/11/2009 d 02:58
источник пользователем

голоса
2

Я думаю, что TimeSpan есть все, что нам нужно в этом, без необходимости прибегать к 365.25 (или любому другому приближению). Расширение на примере AUG в:

DateTime myBD = new DateTime(1980, 10, 10);
TimeSpan difference = DateTime.Now.Subtract(myBD);

textBox1.Text = difference.Years + " years " + difference.Months + " Months " + difference.Days + " days";
Ответил 26/09/2008 d 21:07
источник пользователем

голоса
1
var birthDate = ... // DOB
var resultDate = DateTime.Now - birthDate;

Использование resultDateВы можете применить TimeSpanсвойства , что вы хотите , чтобы отобразить его.

Ответил 15/02/2018 d 11:17
источник пользователем

голоса
1

Вот самый простой способ рассчитать кого - то возраста.
Расчет кого - то возраста довольно просто, а вот как! Для того , чтобы код работал, вам нужен объект DateTime , называемого BirthDate содержащего день рождения.

 C#
        // get the difference in years
        int years = DateTime.Now.Year - BirthDate.Year; 
        // subtract another year if we're before the
        // birth day in the current year
        if (DateTime.Now.Month < BirthDate.Month || 
            (DateTime.Now.Month == BirthDate.Month && 
            DateTime.Now.Day < BirthDate.Day)) 
            years--;
  VB.NET
        ' get the difference in years
        Dim years As Integer = DateTime.Now.Year - BirthDate.Year
        ' subtract another year if we're before the
        ' birth day in the current year
        If DateTime.Now.Month < BirthDate.Month Or (DateTime.Now.Month = BirthDate.Month And DateTime.Now.Day < BirthDate.Day) Then 
            years = years - 1
        End If
Ответил 08/02/2018 d 15:10
источник пользователем

голоса
1

Для того, чтобы подсчитать, сколько лет человек,

DateTime DateOfBirth;

int AgeInYears = DateTime.Now.Year - DateOfBirth.Year;
Ответил 31/10/2017 d 12:09
источник пользователем

голоса
1

Простой код

 var birthYear=1993;
 var age = DateTime.Now.AddYears(-birthYear).Year;
Ответил 27/10/2017 d 06:43
источник пользователем

голоса
1

Я бы просто сделать это:

DateTime birthDay = new DateTime(1990, 05, 23);
DateTime age = DateTime.Now - birthDay;

Таким образом, вы можете вычислить точный возраст человека, вплоть до миллисекунды, если вы хотите.

Ответил 02/07/2015 d 07:37
источник пользователем

голоса
1

Просто потому, что я не думаю, что верхний ответ, что ясно:

public static int GetAgeByLoop(DateTime birthday)
{
    var age = -1;

    for (var date = birthday; date < DateTime.Today; date = date.AddYears(1))
        age++;

    return age;
}
Ответил 17/02/2015 d 17:24
источник пользователем

голоса
1

Как же помощь MSDN не сказать вам, что? Выглядит это так очевидно:

System.DateTime birthTime = AskTheUser(myUser); // :-)
System.DateTime now = System.DateTime.Now;
System.TimeSpan age = now - birthTime; //as simple as that
double ageInDays = age.TotalDays; // will you convert to whatever you want yourself?
Ответил 19/09/2013 d 14:15
источник пользователем

голоса
1

С меньшим количеством переходов и UtcNow, этот код может позаботиться кто-то родился 29 февраля в високосный год:

public int GetAge(DateTime DateOfBirth)
{
    var Now = DateTime.UtcNow;
    return Now.Year - DateOfBirth.Year -
        (
            (
                Now.Month > DateOfBirth.Month ||
                (Now.Month == DateOfBirth.Month && Now.Day >= DateOfBirth.Day)
            ) ? 0 : 1
        );
}
Ответил 08/09/2013 d 12:01
источник пользователем

голоса
1

Вот очень простой и легко следовать примеру.

private int CalculateAge()
{
//get birthdate
   DateTime dtBirth = Convert.ToDateTime(BirthDatePicker.Value);
   int byear = dtBirth.Year;
   int bmonth = dtBirth.Month;
   int bday = dtBirth.Day;
   DateTime dtToday = DateTime.Now;
   int tYear = dtToday.Year;
   int tmonth = dtToday.Month;
   int tday = dtToday.Day;
   int age = tYear - byear;
   if (bmonth < tmonth)
       age--;
   else if (bmonth == tmonth && bday>tday)
   {
       age--;
   }
return age;
}
Ответил 02/01/2013 d 17:09
источник пользователем

голоса
1

Попробуйте это решение, это работает.

int age = (Int32.Parse(DateTime.Today.ToString("yyyyMMdd")) - 
           Int32.Parse(birthday.ToString("yyyyMMdd rawrrr"))) / 10000;
Ответил 04/07/2012 d 12:28
источник пользователем

голоса
1

Я создал Возраст-структуру, которая выглядит следующим образом:

public struct Age : IEquatable<Age>, IComparable<Age>
{
    private readonly int _years;
    private readonly int _months;
    private readonly int _days;

    public int Years  { get { return _years; } }
    public int Months { get { return _months; } }
    public int Days { get { return _days; } }

    public Age( int years, int months, int days ) : this()
    {
        _years = years;
        _months = months;
        _days = days;
    }

    public static Age CalculateAge( DateTime dateOfBirth, DateTime date )
    {
        // Here is some logic that ressembles Mike's solution, although it
        // also takes into account months & days.
        // Ommitted for brevity.
        return new Age (years, months, days);
    }

    // Ommited Equality, Comparable, GetHashCode, functionality for brevity.
}
Ответил 16/12/2009 d 10:55
источник пользователем

голоса
-1

Один линейный ответ,

    DateTime dateOfBirth = Convert.ToDateTime("01/16/1990");
    var age = ((DateTime.Now - dateOfBirth).Days) / 365;
Ответил 29/07/2014 d 12:46
источник пользователем

голоса
-2

Проверь это:

TimeSpan ts = DateTime.Now.Subtract(Birthdate);
age = (byte)(ts.TotalDays / 365.25);
Ответил 09/05/2015 d 22:03
источник пользователем

голоса
-2

Для вычисления возраста с ближайшим возрастом:

var ts = DateTime.Now - new DateTime(1988, 3, 19);
var age = Math.Round(ts.Days / 365.0);
Ответил 03/12/2013 d 11:14
источник пользователем

голоса
-3

Я не люблю много ответов здесь, потому что они занимают несколько строк кода, чтобы сделать то, что должно быть очень простой расчет datemath (пожалуйста, сохраните все ваши комментарии по поводу расчета возраста в других культурах, если вы хотите опубликовать ответ, который покрывает их). Мой один лайнер, используя простые datemath и математические функции, которые существуют в C #, SQLServer, MySQL и т.д. является:

year(@today)-year(@birthDate)+floor((month(@today)-month(@birthdate)+floor((day(@today)-day(@birthdate))/31))/12)

Но я также очень похож на ответ Мэтью выше. В любом случае это намного эффективнее, чем другие ответы, данные здесь.

Ответил 23/07/2015 d 16:03
источник пользователем

голоса
-3
int age = DateTime.Now.Year - birthday.Year;
if (DateTime.Now.Month < birthday.Month || DateTime.Now.Month == birthday.Month 
&& DateTime.Now.Day < birthday.Day) age--;
Ответил 11/06/2014 d 12:23
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more