#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