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

Источник: http://csharphelper.com/blog/2015/02/find-elapsed-time-in-years-months-days-hours-minutes-and-seconds-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector