#if FRAMEWORK20 using System; using System.Collections.Generic; using System.Text; namespace DevComponents.Schedule.Model { public static class DateTimeHelper { /// /// Returns number of weekdays (Monday-Friday) between two dates. /// /// Start date /// End date /// Total number of weekdays between two dates public static int TotalWeekDays(DateTime startDateTime, DateTime endDateTime) { int totalDays = 0; startDateTime = new DateTime(startDateTime.Year, startDateTime.Month, startDateTime.Day); endDateTime = new DateTime(endDateTime.Year, endDateTime.Month, endDateTime.Day, 23, 59, 0); // Start date to monday if (startDateTime.DayOfWeek == DayOfWeek.Saturday) startDateTime = startDateTime.AddDays(2); else if (startDateTime.DayOfWeek == DayOfWeek.Sunday) startDateTime = startDateTime.AddDays(1); else { DateTime newStartDateTime = startDateTime.AddDays(8 - (int)startDateTime.DayOfWeek); if (newStartDateTime > endDateTime) { if (endDateTime.DayOfWeek == DayOfWeek.Saturday) endDateTime = endDateTime.AddDays(-1); else if (endDateTime.DayOfWeek == DayOfWeek.Sunday) endDateTime = endDateTime.AddDays(-2); return (int)Math.Ceiling(Math.Max(0, endDateTime.Subtract(startDateTime).TotalDays)); } totalDays = 6 - (int)startDateTime.DayOfWeek; startDateTime = newStartDateTime; } // End date to Sunday if (endDateTime.DayOfWeek == DayOfWeek.Saturday) endDateTime = endDateTime.AddDays(1); else if (endDateTime.DayOfWeek != DayOfWeek.Sunday) { int d = (int)endDateTime.DayOfWeek; DateTime newEndDateTime = endDateTime.AddDays(-(int)endDateTime.DayOfWeek); totalDays += d; endDateTime=newEndDateTime; } int t = (int)Math.Max(0, Math.Ceiling(endDateTime.Subtract(startDateTime).TotalDays)); if (t > 0) totalDays += (t / 7) * 5; return totalDays; } /// /// Return total number of days specified by day parameter between two dates. /// /// Start date. /// End date. /// Day of week /// Number of days between two dates public static int TotalDays(DateTime startDate, DateTime endDate, DayOfWeek day) { if (endDate < startDate) return 0; if (startDate.DayOfWeek > day) startDate = startDate.AddDays(7 - ((int)startDate.DayOfWeek - (int)day)); else startDate = startDate.AddDays(day - startDate.DayOfWeek); if (endDate < startDate) return 0; if (endDate.DayOfWeek < day) endDate = endDate.AddDays(-(7 - ((int)day - (int)endDate.DayOfWeek))); else endDate = endDate.AddDays(day - endDate.DayOfWeek); if (endDate.Subtract(startDate).TotalDays <= 1) return 1; int t = (int)Math.Ceiling(endDate.Subtract(startDate).TotalDays); int totalDays = (int)Math.Floor(Math.Max(1, (double)t / 7)) + 1; // +1 since endDate is always on the day //if (endDate.RelativeDayOfWeek == day) totalDays++; return totalDays; } public static int TotalNumberOfDays(DateTime startDate, DateTime endDate, eDayOfWeekRecurrence daysOfWeek) { int totalDays=0; if (daysOfWeek == eDayOfWeekRecurrence.All) return (int)Math.Ceiling(endDate.Subtract(startDate).TotalDays); if ((daysOfWeek & eDayOfWeekRecurrence.Friday) != 0) totalDays += TotalDays(startDate, endDate, DayOfWeek.Friday); if ((daysOfWeek & eDayOfWeekRecurrence.Monday) != 0) totalDays += TotalDays(startDate, endDate, DayOfWeek.Monday); if ((daysOfWeek & eDayOfWeekRecurrence.Saturday) != 0) totalDays += TotalDays(startDate, endDate, DayOfWeek.Saturday); if ((daysOfWeek & eDayOfWeekRecurrence.Sunday) != 0) totalDays += TotalDays(startDate, endDate, DayOfWeek.Sunday); if ((daysOfWeek & eDayOfWeekRecurrence.Thursday) != 0) totalDays += TotalDays(startDate, endDate, DayOfWeek.Thursday); if ((daysOfWeek & eDayOfWeekRecurrence.Tuesday) != 0) totalDays += TotalDays(startDate, endDate, DayOfWeek.Tuesday); if ((daysOfWeek & eDayOfWeekRecurrence.Wednesday) != 0) totalDays += TotalDays(startDate, endDate, DayOfWeek.Wednesday); return totalDays; } /// /// Returns the date/time that represents end of the day value. /// /// /// public static DateTime EndOfDay(DateTime day) { return new DateTime(day.Year, day.Month, day.Day, 23, 59, 59); } /// /// Returns the date/time that represents beginning of the day value. /// /// /// public static DateTime BeginningOfDay(DateTime day) { return new DateTime(day.Year, day.Month, day.Day, 0, 0, 0); } /// /// Returns true if date falls at begging of the day 12:00 AM /// /// /// public static bool IsBeginningOfDay(DateTime day) { return day.Equals(BeginningOfDay(day)); } internal static bool HasDay(DayOfWeek dayOfWeek, eDayOfWeekRecurrence days) { if (dayOfWeek == DayOfWeek.Monday && (days & eDayOfWeekRecurrence.Monday) != 0) return true; if (dayOfWeek == DayOfWeek.Tuesday && (days & eDayOfWeekRecurrence.Tuesday) != 0) return true; if (dayOfWeek == DayOfWeek.Wednesday && (days & eDayOfWeekRecurrence.Wednesday) != 0) return true; if (dayOfWeek == DayOfWeek.Thursday && (days & eDayOfWeekRecurrence.Thursday) != 0) return true; if (dayOfWeek == DayOfWeek.Friday && (days & eDayOfWeekRecurrence.Friday) != 0) return true; if (dayOfWeek == DayOfWeek.Saturday && (days & eDayOfWeekRecurrence.Saturday) != 0) return true; if (dayOfWeek == DayOfWeek.Sunday && (days & eDayOfWeekRecurrence.Sunday) != 0) return true; return false; } public static bool IsWeekendDay(DateTime currentDay) { return currentDay.DayOfWeek == DayOfWeek.Sunday || currentDay.DayOfWeek == DayOfWeek.Saturday; } /// /// Gets greater date between two dates. /// /// Date 1 /// Date 2 /// Greater date. public static DateTime MaxDate(DateTime date1, DateTime date2) { return date1 > date2 ? date1 : date2; } /// /// Returns true if both dates are on same day and year. /// /// First date /// Second date /// true if dates are on same day and year public static bool IsSameDay(DateTime date1, DateTime date2) { return (date1.Year == date2.Year && date1.Month == date2.Month && date1.Day == date2.Day) || date1.Date.AddDays(1) == date2; //return date1.Year == date2.Year && date1.Month == date2.Month && date1.Day == date2.Day; } /// /// Returns true if time periods overlap. /// /// Start of first period. /// End of first period. /// Start of second period. /// End of second period. /// true if periods overlap public static bool TimePeriodsOverlap(DateTime startTime1, DateTime endTime1, DateTime startTime2, DateTime endTime2) { if (startTime1 <= startTime2 && endTime1 > startTime2 || startTime1 >= startTime2 && startTime1 < endTime2) return true; return false; } } } #endif