c # вычисление возраста с использованием даты и времени, но данная дата рождения переходит на 01-01-0001 - PullRequest
0 голосов
/ 09 марта 2019

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

Дата рождения устанавливается здесь:

private DateTime BirthDate { get; set; }

Вот как я вычисляю возраст человека:

public int Age
    {
        get
        {
            int Age = (int)(DateTime.Today - BirthDate).TotalDays;
            Age = Age / 365;
            return Age;
        }
    }

Это дата рождения, которую я пытаюсь использовать:

new DateTime(2000, 3, 12)

Но всякий раз, когда я использую отладчик в Visual Studio, он дает дату рождения: 01-01-0001

РЕДАКТИРОВАТЬ: это остальная часть кода, где я использую DateTime: эта частьВ моем основном классе:

Customer cust = new Customer();

        cust.VoegToe(new Customer("Lionel Messi", new DateTime(2000, 3, 12), new DateTime(2019, 2, 23)));

Эта часть в моем подклассе:

public Customer()
            {
                customers = new List<Customer>();
            }




        public Customer(string name, DateTime BirthDate, DateTime signUpDate)
        {
            this.name = name;
            this.signUpDate = signUpDate;
            this.BirthDate= BirthDate;
        }

Есть ли способ это исправить?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Ну, ваша логика ошибочна.Самое главное, так как он не учитывает високосные годы.Другое дело, что класс DateTime дает вам все необходимое из коробки.

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

static class AgeCalculator
{
    static int GetAgeInYears(DateTime birth) => GetAgeInYears(brith, DateTime.Today);

    static int GetAgeInYears(DateTime birth, DateTime mes)
    {
        var age = mes.Year - birth.Year - 1;
        // if the birthday already has past (or is today)
        if(birth.Month > mes.Month || (birth.Month == mes.Month && birth.Day => mes.Day)
        {
            age++;
        }
        return age;
    }

Более продвинутый подход - создать класс / структуру DateTimeSpan, которая также отслеживает количество дней (и / или месяцев) возраста.Но в большинстве случаев это не является частью варианта использования.

0 голосов
/ 09 марта 2019

Я только что проверил предоставленный вами код, и он отлично работает с 1 клиентом.Вероятно, проблема в том, что у вас в списке есть класс Customer, содержащий список клиентов и способ доступа к возрасту экземпляров объектов.

Это прекрасно работает:

    public class Customer
    {
        private string name;
        private DateTime signUpDate;

        public DateTime BirthDate { get; }

        public int Age
        {
            get
            {
                int Age = (int)(DateTime.Today - BirthDate).TotalDays;
                Age = Age / 365;
                return Age;
            }
        }

        public Customer(string name, DateTime BirthDate, DateTime signUpDate)
        {
            this.name = name;
            this.signUpDate = signUpDate;
            this.BirthDate = BirthDate;
        }
    }

Скнопка, чтобы вычислить возраст и показать:

        private void button1_Click(object sender, EventArgs e)
        {
            Customer test = new Customer("Lionel Messi", new DateTime(2000, 3, 12), new DateTime(2019, 2, 23));

            teAge.Text = test.Age.ToString();
        }

Если вы хотите сообщить точно, как вы получаете возраст, возможно, я могу помочь вам больше.

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