Найдите прошедшее время в годах, месяцах, днях, часах, минутах и секундах в C#
Структура TimeSpan представляет собой прошедшее время. Он имеет Days, Hours, Minutes, Seconds и Milliseconds свойства, которые сообщают вы о времени, прошедшем. Например, если две даты составляют 3 дня и 4 часа, то Days = 3 и Hours = 4.
Нелегко сказать, насколько далеки друг от друга две даты годами и месяцами, потому что годы и месяцы не все имеют одинаковую длину. Вместо того, чтобы приносить некоторые результаты, Microsoft просто не включала свойства Years и Months в структуре TimeSpan.
В этом примере вычисляется разница во времени с годами и месяцами, но иногда это приводит к неожиданным результатам. Например, разница между 29 февраля 2004 года и 28 февраля 2008 года составляет 3 года, 11 месяцев и 31 день. В другом примере разница между 29 февраля 2004 года и 28 февраля 2007 года составляет 3 года, потому что нет 29 февраля 2007 года.
Следующий метод GetElapsedTime возвращает прошедшее время между двумя датами в годах, месяцах, днях, часах, минутах, секундах и миллисекундах.
// Возвращает количество лет, месяцев, дней, часов, // минуты, секунды и миллисекунды, которые нужно добавить в // from_date, чтобы получить to_date. private void GetElapsedTime(DateTime from_date, DateTime to_date, out int years, out int months, out int days, out int hours, out int minutes, out int seconds, out int milliseconds) { // Если from_date & gt; to_date, переключите их. if (from_date > to_date) { GetElapsedTime(to_date, from_date, out years, out months, out days, out hours, out minutes, out seconds, out milliseconds); years = -years; months = -months; days = -days; hours = -hours; minutes = -minutes; seconds = -seconds; milliseconds = -milliseconds; } else { // Управление годами. years = to_date.Year - from_date.Year; // Посмотрим, зашли ли мы слишком далеко. DateTime test_date = from_date.AddMonths(12 * years); if (test_date > to_date) { years--; test_date = from_date.AddMonths(12 * years); } // Добавьте месяцы, пока мы не заходим слишком далеко. months = 0; while (test_date <= to_date) { months++; test_date = from_date.AddMonths(12 * years + months); } months--; // Вычитаем, сколько еще дней, // часы, минуты и т. д. нам нужно. from_date = from_date.AddMonths(12 * years + months); TimeSpan remainder = to_date - from_date; days = remainder.Days; hours = remainder.Hours; minutes = remainder.Minutes; seconds = remainder.Seconds; milliseconds = remainder.Milliseconds; } }
Если дата начала находится после даты окончания, тогда метод вызывает изменение своих дат и отрицание результатов.
После того, как дата начала будет завершена до даты окончания, программа вычитает годы «лет» и добавляет этот номер к дате начала. Если результат после даты окончания, он вычитает 1 из числа лет.
Далее программа добавляет месяцы к дате начала, пока результат не будет после даты окончания. Затем он вычитает последний месяц.
Программа работает в течение нескольких месяцев, поэтому метод AddMonths структуры DateTime может обрабатывать такие странности, как месяцы с разными количествами дней. Например, если вы добавите 1 месяц до 31 марта, вы получите 30 апреля, потому что апрель имеет только 30 дней.
После того, как он найдет наибольшее количество лет и месяцев, он может добавить к дате начала, программа использует TimeSpan для представления времени между скорректированной датой начала и датой окончания. Затем он использует структуру TimeSpan Days, Hours, Minutes, Seconds и Свойства Milliseconds.