#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 не годится для решения вашей задачи.
Комментариев нет:
Отправить комментарий