Найдите прошедшее время в годах, месяцах, днях, часах, минутах и секундах в 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.
