Вычислить количество месяцев и дней между датами - 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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д