Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Проверка корректности алгоритма, вычисляющего разницу между двумя датами(например длину жизни)

#c_sharp #алгоритм #инспекция_кода


private void OnTextChanged(object sender, TextChangedEventArgs e)
{
    DateTime db, de;
    if (DateTime.TryParse(tbegin.Text, out db) && DateTime.TryParse(tEnd.Text, out de))
    {
        if(de > db)
        {
            int years, months,days;
            years = de.Year - db.Year;
            months = de.Month - db.Month;
            days = de.Day - db.Day;

            if(months < 0)
            {
                years--;
                months += 12;
            }
            if(days < 0)
            {
                months--;
                days += DateTime.DaysInMonth(de.Year, de.Month-1);
            }
            result.Content = $"you live {years} years {months} months {days} days";
        }
    }
    else
    {
        result.Content = null;
    }

}



tbegin и tEnd — текстбоксы с датами
de — DateTime представление конечной даты, db — DateTime представление начальной даты
result — лейбл в который выводится результат


не уверен в правильности вычисления даты для случаев типа:

tbegin.Text = "20.10.1985";
tEnd.Text = "09.07.2016";

    


Ответы

Ответ 1



Вы можете неучесть множество особенностей (високосность итп.). Кроме того у вас нету условия else (de = db de < db) в if(de > db) Этот вариант лучше вашего. https://msdn.microsoft.com/ru-ru/library/8ysw4sby(v=vs.110).aspx System.DateTime date1 = new System.DateTime(1996, 6, 3, 22, 15, 0); System.DateTime date2 = new System.DateTime(1996, 12, 6, 13, 2, 0); System.DateTime date3 = new System.DateTime(1996, 10, 12, 8, 42, 0); // diff1 gets 185 days, 14 hours, and 47 minutes. System.TimeSpan diff1 = date2.Subtract(date1); // date4 gets 4/9/1996 5:55:00 PM. System.DateTime date4 = date3.Subtract(diff1); // diff2 gets 55 days 4 hours and 20 minutes. System.TimeSpan diff2 = date2 - date3; // date5 gets 4/9/1996 5:55:00 PM. System.DateTime date5 = date1 - diff2; Вы можете вынести вычисления в одну функцию и вызывать например result.Content = GetDiff(две даты)

Ответ 2



Я бы на вашем месте конвертировал DateTime в UNIX time. Unix time является обычным числом, поэтому с ним легче работать (складывать, вычитать и тд). Конвертация DateTime в UNIX time (в примере получение текущего времени): int unixTime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; Конвертация UNIX time в DateTime: DateTime date = (new DateTime(1970, 1, 1, 0, 0, 0, 0)).AddSeconds(unixTime); Вы можете конвертировать необходимые даты в UNIX time, произвести необходимые расчеты, затем конвертировать результат в DateTime Также вы можете создать свою версию UNIX time с большим числом разрядов и выбрать любую другую дату для начала отсчета, если Unix time не годится для решения вашей задачи.

Комментариев нет:

Отправить комментарий