207 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
#if FRAMEWORK20
 | 
						|
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Text;
 | 
						|
 | 
						|
namespace DevComponents.Schedule.Model
 | 
						|
{
 | 
						|
    public static class DateTimeHelper
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Returns number of weekdays (Monday-Friday) between two dates.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="startDateTime">Start date</param>
 | 
						|
        /// <param name="endDateTime">End date</param>
 | 
						|
        /// <returns>Total number of weekdays between two dates</returns>
 | 
						|
        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;
 | 
						|
            
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Return total number of days specified by day parameter between two dates.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="startDate">Start date.</param>
 | 
						|
        /// <param name="endDate">End date.</param>
 | 
						|
        /// <param name="day">Day of week</param>
 | 
						|
        /// <returns>Number of days between two dates</returns>
 | 
						|
        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;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns the date/time that represents end of the day value.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="_DayDate"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static DateTime EndOfDay(DateTime day)
 | 
						|
        {
 | 
						|
            return new DateTime(day.Year, day.Month, day.Day, 23, 59, 59);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns the date/time that represents beginning of the day value.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="_DayDate"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static DateTime BeginningOfDay(DateTime day)
 | 
						|
        {
 | 
						|
            return new DateTime(day.Year, day.Month, day.Day, 0, 0, 0);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns true if date falls at begging of the day 12:00 AM
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="_DayDate"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        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;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets greater date between two dates.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="date1">Date 1</param>
 | 
						|
        /// <param name="date2">Date 2</param>
 | 
						|
        /// <returns>Greater date.</returns>
 | 
						|
        public static DateTime MaxDate(DateTime date1, DateTime date2)
 | 
						|
        {
 | 
						|
            return date1 > date2 ? date1 : date2;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns true if both dates are on same day and year.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="date1">First date</param>
 | 
						|
        /// <param name="date2">Second date</param>
 | 
						|
        /// <returns>true if dates are on same day and year</returns>
 | 
						|
        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;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns true if time periods overlap.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="startTime1">Start of first period.</param>
 | 
						|
        /// <param name="endTime1">End of first period.</param>
 | 
						|
        /// <param name="startTime2">Start of second period.</param>
 | 
						|
        /// <param name="endTime2">End of second period.</param>
 | 
						|
        /// <returns>true if periods overlap</returns>
 | 
						|
        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
 | 
						|
 |