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

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

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

В общем-то не охота писать такой код самому. Как уже имеющими средствами (тем же DateTime) вычислить число месяцев и дней между датами? К примеру между 16.04.2016 и 17.05.2016 = 1 месяц и 1 день.
Сам все-таки сделал. Вот код, кому интересно:
Листинг программы
  1. class DateInterval
  2. {
  3. public int Months { get; private set; }
  4. public int Days { get; private set; }
  5. int[] DaysCount = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  6. public DateInterval(DateTime date1, DateTime date2)
  7. {
  8. DateTime min, max;
  9. min = date1 < date2 ? date1 : date2;
  10. max = date1 > date2 ? date1 : date2;
  11. if (min.Year == max.Year && min.Month == max.Month) //если год и месяц совпадают, то остается вычислить дни
  12. {
  13. Months = 0;
  14. Days = (max - min).Days;
  15. return;
  16. }
  17. Months = ((max.Year - min.Year) * 12) + max.Month - min.Month; //вычисляем число месяцев между датами
  18. if (max.Day < min.Day) //поправка на месяца (пример 16.04.2016 и 15.04.2016) - между этими датами нет полного месяца, в таком случае нужно вычесть 1 месяц
  19. {
  20. Months--;
  21. }
  22. int PrevDays = DaysCount[max.Month - 2]; //количество дней в предыдущем месяце (-2 т.к. индексы идут с нуля)
  23. if (max.Month == 2 && max.Year % 4 == 0) //поправка на високосный год
  24. {
  25. PrevDays++;
  26. }
  27. Days = (PrevDays - min.Day) + max.Day; // (кол-во дней в пред. месяце - кол-во прошедших дней в пред. месяце) + кол-во прошедших дней в текущем месяце
  28. }
  29. }

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

textual
Листинг программы
  1. public struct DateTimeSpan
  2. {
  3.     private readonly int years;
  4.     private readonly int months;
  5.     private readonly int days;
  6.     private readonly int hours;
  7.     private readonly int minutes;
  8.     private readonly int seconds;
  9.     private readonly int milliseconds;
  10.  
  11.     public DateTimeSpan(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds)
  12.     {
  13.         this.years = years;
  14.         this.months = months;
  15.         this.days = days;
  16.         this.hours = hours;
  17.         this.minutes = minutes;
  18.         this.seconds = seconds;
  19.         this.milliseconds = milliseconds;
  20.     }
  21.  
  22.     public int Years { get { return years; } }
  23.     public int Months { get { return months; } }
  24.     public int Days { get { return days; } }
  25.     public int Hours { get { return hours; } }
  26.     public int Minutes { get { return minutes; } }
  27.     public int Seconds { get { return seconds; } }
  28.     public int Milliseconds { get { return milliseconds; } }
  29.  
  30.     enum Phase { Years, Months, Days, Done }
  31.  
  32.     public static DateTimeSpan CompareDates(DateTime date1, DateTime date2)
  33.     {
  34.         if (date2 < date1)
  35.         {
  36.             var sub = date1;
  37.             date1 = date2;
  38.             date2 = sub;
  39.         }
  40.  
  41.         DateTime current = date1;
  42.         int years = 0;
  43.         int months = 0;
  44.         int days = 0;
  45.  
  46.         Phase phase = Phase.Years;
  47.         DateTimeSpan span = new DateTimeSpan();
  48.         int officialDay = current.Day;
  49.  
  50.         while (phase != Phase.Done)
  51.         {
  52.             switch (phase)
  53.             {
  54.                 case Phase.Years:
  55.                     if (current.AddYears(years + 1) > date2)
  56.                     {
  57.                         phase = Phase.Months;
  58.                         current = current.AddYears(years);
  59.                     }
  60.                     else
  61.                     {
  62.                         years++;
  63.                     }
  64.                     break;
  65.                 case Phase.Months:
  66.                     if (current.AddMonths(months + 1) > date2)
  67.                     {
  68.                         phase = Phase.Days;
  69.                         current = current.AddMonths(months);
  70.                         if (current.Day < officialDay && officialDay <= DateTime.DaysInMonth(current.Year, current.Month))
  71.                             current = current.AddDays(officialDay - current.Day);
  72.                     }
  73.                     else
  74.                     {
  75.                         months++;
  76.                     }
  77.                     break;
  78.                 case Phase.Days:
  79.                     if (current.AddDays(days + 1) > date2)
  80.                     {
  81.                         current = current.AddDays(days);
  82.                         var timespan = date2 - current;
  83.                         span = new DateTimeSpan(years, months, days, timespan.Hours, timespan.Minutes, timespan.Seconds, timespan.Milliseconds);
  84.                         phase = Phase.Done;
  85.                     }
  86.                     else
  87.                     {
  88.                         days++;
  89.                     }
  90.                     break;
  91.             }
  92.         }
  93.  
  94.         return span;
  95.     }
  96. }

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


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

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

6   голосов , оценка 4.333 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы