Вычислить количество месяцев и дней между датами - C#

Узнай цену своей работы

Формулировка задачи:

В общем-то не охота писать такой код самому. Как уже имеющими средствами (тем же DateTime) вычислить число месяцев и дней между датами? К примеру между 16.04.2016 и 17.05.2016 = 1 месяц и 1 день.
Сам все-таки сделал. Вот код, кому интересно:
 class DateInterval
    {
        public int Months { get; private set; }
        public int Days { get; private set; }
 
        int[] DaysCount = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
        public DateInterval(DateTime date1, DateTime date2)
        {
            DateTime min, max;
 
            min = date1 < date2 ? date1 : date2;
            max = date1 > date2 ? date1 : date2;
 
            if (min.Year == max.Year && min.Month == max.Month) //если год и месяц совпадают, то остается вычислить дни
            {
                Months = 0;
                Days = (max - min).Days;
                return;
            }
 
            Months = ((max.Year - min.Year) * 12) + max.Month - min.Month; //вычисляем число месяцев между датами
           
            if (max.Day < min.Day) //поправка на месяца (пример 16.04.2016 и 15.04.2016) - между этими датами нет полного месяца, в таком случае нужно вычесть 1 месяц
            {
                Months--;
            }
 
            int PrevDays = DaysCount[max.Month - 2]; //количество дней в предыдущем месяце (-2 т.к. индексы идут с нуля)
 
            if (max.Month == 2 && max.Year % 4 == 0) //поправка на високосный год
            {
                PrevDays++;
            }
 
            Days = (PrevDays - min.Day) + max.Day; // (кол-во дней в пред. месяце - кол-во прошедших дней в пред. месяце) + кол-во прошедших дней в текущем месяце
        }
    }

Решение задачи: «Вычислить количество месяцев и дней между датами»

textual
Листинг программы
public struct DateTimeSpan
{
    private readonly int years;
    private readonly int months;
    private readonly int days;
    private readonly int hours;
    private readonly int minutes;
    private readonly int seconds;
    private readonly int milliseconds;
 
    public DateTimeSpan(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds)
    {
        this.years = years;
        this.months = months;
        this.days = days;
        this.hours = hours;
        this.minutes = minutes;
        this.seconds = seconds;
        this.milliseconds = milliseconds;
    }
 
    public int Years { get { return years; } }
    public int Months { get { return months; } }
    public int Days { get { return days; } }
    public int Hours { get { return hours; } }
    public int Minutes { get { return minutes; } }
    public int Seconds { get { return seconds; } }
    public int Milliseconds { get { return milliseconds; } }
 
    enum Phase { Years, Months, Days, Done }
 
    public static DateTimeSpan CompareDates(DateTime date1, DateTime date2)
    {
        if (date2 < date1)
        {
            var sub = date1;
            date1 = date2;
            date2 = sub;
        }
 
        DateTime current = date1;
        int years = 0;
        int months = 0;
        int days = 0;
 
        Phase phase = Phase.Years;
        DateTimeSpan span = new DateTimeSpan();
        int officialDay = current.Day;
 
        while (phase != Phase.Done)
        {
            switch (phase)
            {
                case Phase.Years:
                    if (current.AddYears(years + 1) > date2)
                    {
                        phase = Phase.Months;
                        current = current.AddYears(years);
                    }
                    else
                    {
                        years++;
                    }
                    break;
                case Phase.Months:
                    if (current.AddMonths(months + 1) > date2)
                    {
                        phase = Phase.Days;
                        current = current.AddMonths(months);
                        if (current.Day < officialDay && officialDay <= DateTime.DaysInMonth(current.Year, current.Month))
                            current = current.AddDays(officialDay - current.Day);
                    }
                    else
                    {
                        months++;
                    }
                    break;
                case Phase.Days:
                    if (current.AddDays(days + 1) > date2)
                    {
                        current = current.AddDays(days);
                        var timespan = date2 - current;
                        span = new DateTimeSpan(years, months, days, timespan.Hours, timespan.Minutes, timespan.Seconds, timespan.Milliseconds);
                        phase = Phase.Done;
                    }
                    else
                    {
                        days++;
                    }
                    break;
            }
        }
 
        return span;
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы