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

В Windows Server 2012 R2 у меня возникли проблемы с учетной записью пользователя

psexec -u administrator -p password \\machinename -h -s -d -accepteula cmd.exe

. Но она работает нормально, если вы запускаете без параметров -h -s. Вот почему я использую это, чтобы решить мою проблему:

psexec -accepteula -u administrator -p password \\machinename %PathToLocalUtils%\psexec.exe -h -s -d  cmd.exe
1742
задан 29 revs, 25 users 37% 21 April 2018 в 17:48
поделиться

18 ответов

Легкое для понимания и простое решение.

// 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.Date > today.AddYears(-age)) age--;

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

1957
ответ дан 25 revs, 15 users 20% 21 April 2018 в 17:48
поделиться

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

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

Hope это помогает.

33
ответ дан 3 revs 21 April 2018 в 17:48
поделиться

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

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

, Которое, кажется, имеет год, изменяясь в правильную дату. (Я определяю протестированный до возраста 107)

82
ответ дан 2 revs, 2 users 89% 21 April 2018 в 17:48
поделиться

Я создал Пользователя 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;
    }
};
26
ответ дан 3 revs, 3 users 95% 21 April 2018 в 17:48
поделиться

Это - странный способ сделать это, но если Вы форматируете дату к 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;
}
964
ответ дан 12 revs, 8 users 38% 21 April 2018 в 17:48
поделиться

Другая функция, не мной, но найденный в сети и усовершенствованный это немного:

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. Теперь находится в определенной для сервера культуре, я думаю. У меня есть абсолютно 0 знаний о фактическом работании с азиатскими календарями, и я не знаю, существует ли простой способ преобразовать даты между календарями, но на всякий случай Вы задаетесь вопросом о тех китайских парнях с 4660 года:-)

70
ответ дан 5 revs, 3 users 93% 21 April 2018 в 17:48
поделиться

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

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

127
ответ дан 2 revs, 2 users 86% 21 April 2018 в 17:48
поделиться

Я думаю, что TimeSpan имеет все, в чем мы нуждаемся в нем, не имея необходимость обращаться к 365,25 (или любое другое приближение). Подробно останавливаясь на примере в августе:

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

textBox1.Text = difference.Years + " years " + difference.Months + " Months " + difference.Days + " days";
4
ответ дан 3 revs, 3 users 80%BigJim 21 April 2018 в 17:48
поделиться

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

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

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

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

38
ответ дан 2 revs, 2 users 86% 21 April 2018 в 17:48
поделиться

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

int age = new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year-1;
47
ответ дан 22 November 2019 в 20:09
поделиться

Я потратил некоторое время, работая над этим, и придумал это, чтобы вычислить чей-то возраст в годах, месяцах и днях. Я тестировал проблему 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++;
    }

}
24
ответ дан 22 November 2019 в 20:09
поделиться

Вот решение.

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);
17
ответ дан 22 November 2019 в 20:09
поделиться

I don't know how the wrong solution can be accepted. Правильный фрагмент кода 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
                CalculateAgeCorrect2(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;
}

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

    // for leap years we need this
    if (birthDate > now.AddYears(-age)) age--;
    // don't use:
    // if (birthDate.AddYears(age) > now) age--;

    return age;
}
376
ответ дан 22 November 2019 в 20:09
поделиться

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

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;
    }
}
32
ответ дан 22 November 2019 в 20:09
поделиться

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

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.");
19
ответ дан 22 November 2019 в 20:09
поделиться

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

public override bool IsValid(DateTime value)
{
    _dateOfBirth =  value;
    var yearsOld = (double) (DateTime.Now.Subtract(_dateOfBirth).TotalDays/365);
    if (yearsOld > 18)
        return true;
    return false; 
}
4
ответ дан 22 November 2019 в 20:09
поделиться

I've created an Age struct, which looks like this:

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.
}
2
ответ дан 22 November 2019 в 20:09
поделиться

Вот небольшой пример кода для 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;
}
3
ответ дан 22 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: