Время в годах, днях, часах, секундах, независимо учитывающее високосный год - PullRequest
0 голосов
/ 09 сентября 2018

В настоящее время я работаю над школьным проектом, для которого я выполнил требования, но я хочу испытать себя. Как я могу точно отобразить мой возраст в следующем формате на основе сегодняшней даты / времени?

Возраст: 27 лет - или - дни - или - часы - или - секунды (с учетом високосного года)

Исследование, которое я провел: Как бы вы рассчитали возраст в C #, используя дату рождения (учитывая високосные годы)

Я больше ищу математику за этим. Вот математика, которую я сейчас использую, но она точна только до 16 часов, 960 минут или 57 600 секунд.

// Tried using "double" datatype, still same problem.
int years = DateTime.Now.Year - dateBirthDate.Year;
int days = (years / 4) + (years * 365);
int hours = (days * 24) + DateTime.Now.Hour;
int minutes = hours * 60;
int seconds = (minutes * 60) + ((DateTime.Now.Hour * 60) * 60) + DateTime.Now.Second;

Должен отображаться близко к 0.

Выход:

Thank you Mat, what is your date of birth? Feel free to include the time you were born. 09/08/2018 5:11pm
Years   :0
Days    :0
Minutes :1020
Seconds :122425

# ОБНОВЛЕНИЕ # 1

Мне удалось частично заставить работать код, но я обнаружил еще одну непредвиденную проблему. Теперь он не будет учитывать дни рождения, которые еще не наступили. Мысли?

//Needed casting so I could remove the decimals.
TimeSpan span = DateTime.Now.Subtract(dateBirthDate);
int years = (int)span.Days/365;
int months = years * 12;
int days = (int)span.TotalDays;
int hours = (int)span.TotalHours;
int minutes = (int)span.TotalMinutes;
int seconds = (int)span.TotalSeconds;

1 Ответ

0 голосов
/ 09 сентября 2018

Wonky Обходной путь


Пришлось привести TimeSpan к int, чтобы удалить десятичные дроби. Чтобы получить год TimeSpan, я просто взял месяцы и разделил их на 365, а затем преобразовал его в (int), чтобы он отображал только целое число. Затем я создал условное условие if / else и вложенное для корректировки дней рождения, которые происходят в настоящее время или еще не наступили. Логика кажется здоровой.

        //Needed casting so I could remove the decimals.
        TimeSpan span = DateTime.Now.Subtract(dateBirthDate);

        //Creating workable if/else to account for birthday's yet to come.
        int dateCorrectorMonthNow = DateTime.Now.Month;
        int dateCorrectorDayNow = DateTime.Now.Day;
        int dateCorrectorMonthThen = dateBirthDate.Month;
        int dateCorrectorDayThen = dateBirthDate.Day;


        int years = (int)span.Days/365;
        int months = years * 12;
        int days = (int)span.TotalDays;
        int hours = (int)span.TotalHours;
        int minutes = (int)span.TotalMinutes;
        int seconds = (int)span.TotalSeconds;

        if (dateCorrectorMonthNow <= dateCorrectorMonthThen)
        {
            if (dateCorrectorDayNow  <= dateCorrectorDayThen)
            {
                Console.WriteLine($"Years   :{years}");
            }
            else
            {
                Console.WriteLine($"Years   :{years-1}");
            }
        }
        else
        {
            Console.WriteLine($"Years   :{years}");
        }
...