Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Calculate Business Hours

0.00/5 (No votes)
23 Feb 2010 1  
Method to find out business hours in between two dates. public static double CalculateBusinessHours(DateTime dtStart, DateTime dtEnd) { int StartingHour = 9; int EndingHour = 18; // initialze our return value double OverAllMinutes = 0.0; ...
Method to find out business hours in between two dates.

C#
public static double CalculateBusinessHours(DateTime dtStart, DateTime dtEnd)
   {
       int StartingHour = 9;
       int EndingHour = 18;

       // initialze our return value
       double OverAllMinutes = 0.0;

       // start time must be less than end time
       if (dtStart > dtEnd)
       {
           return OverAllMinutes;
       }
       DateTime ctTempEnd = new DateTime(dtEnd.Year, dtEnd.Month, dtEnd.Day, 0, 0, 0);
       DateTime ctTempStart = new DateTime(dtStart.Year, dtStart.Month, dtStart.Day, 0, 0, 0);

       // check if startdate and enddate are the same day
       bool bSameDay = (ctTempStart == ctTempEnd);

       // calculate the business days between the dates
       int iBusinessDays = GetBusinessDays(ctTempStart, ctTempEnd);

       // now add the time values to our temp times
       TimeSpan CTimeSpan = new TimeSpan(0, dtStart.Hour, dtStart.Minute, 0);
       ctTempStart += CTimeSpan;
       CTimeSpan = new TimeSpan(0, dtEnd.Hour, dtEnd.Minute, 0);
       ctTempEnd += CTimeSpan;

       // set our workingday time range and correct the first day
       DateTime ctMaxTime = new DateTime(ctTempStart.Year, ctTempStart.Month, ctTempStart.Day, EndingHour, 0, 0);
       DateTime ctMinTime = new DateTime(ctTempStart.Year, ctTempStart.Month, ctTempStart.Day, StartingHour, 0, 0);
       Int32 FirstDaySec = CorrectFirstDayTime(ctTempStart, ctMaxTime, ctMinTime);

       // set our workingday time range and correct the last day
       DateTime ctMaxTime1 = new DateTime(ctTempEnd.Year, ctTempEnd.Month, ctTempEnd.Day, EndingHour, 0, 0);
       DateTime ctMinTime1 = new DateTime(ctTempEnd.Year, ctTempEnd.Month, ctTempEnd.Day, StartingHour, 0, 0);
       Int32 LastDaySec = CorrectLastDayTime(ctTempEnd, ctMaxTime1, ctMinTime1);
       Int32 OverAllSec = 0;

       // now sum-up all values
       if (bSameDay)
       {
           if (iBusinessDays != 0)
           {
               TimeSpan cts = ctMaxTime - ctMinTime;
               Int32 dwBusinessDaySeconds = (cts.Days * 24 * 60 * 60) + (cts.Hours * 60 * 60) + (cts.Minutes * 60) + cts.Seconds;
               OverAllSec = FirstDaySec + LastDaySec - dwBusinessDaySeconds;
           }
       }
       else
       {
           if (iBusinessDays > 1)
               OverAllSec =
               ((iBusinessDays - 2) * 9 * 60 * 60) + FirstDaySec + LastDaySec;
       }
       OverAllMinutes = OverAllSec / 60;

       return OverAllMinutes / 60;


   }


This method uses following functions.

C#
public static DateTime AddBusinessDays(DateTime dt, int nDays)
   {
       int weeks = nDays / 5;
       nDays %= 5;
       while (dt.DayOfWeek == DayOfWeek.Saturday || dt.DayOfWeek == DayOfWeek.Sunday)
           dt = dt.AddDays(1);

       while (nDays-- > 0)
       {
           dt = dt.AddDays(1);
           if (dt.DayOfWeek == DayOfWeek.Saturday)
           {
               dt = dt.AddDays(2);
           }
       }
       return dt.AddDays(weeks * 7);
   }

   private static int GetBusinessDays(DateTime ctStart, DateTime ctEnd)
   {
       TimeSpan ctp = ctEnd - ctStart;
       int iDays = ctp.Days + 1;
       int iWeeks = iDays / 7;
       int iBusDays = iWeeks * 5;
       int iRem = iDays % 7;
       while (iRem > 0)
       {
           // no sunday, no saturday
           int iStartDay = (Int32)Enum.Parse(typeof(DayOfWeek), ctStart.DayOfWeek.ToString());
           if (iStartDay != 1 && iStartDay != 7)
           {
               iBusDays++;
           }
           TimeSpan time1 = new TimeSpan(1, 0, 0, 0);
           ctStart += time1;

           iRem--;
       }
       return iBusDays;
   }

   private static Int32 CorrectFirstDayTime(DateTime ctStart, DateTime ctMaxTime, DateTime ctMinTime)
   {
       Int32 daysec = 0;

       if (ctMaxTime < ctStart) // start time is after max time
       {
           return 0; // zero seconds for the first day
       }
       int iStartDay = (Int32)Enum.Parse(typeof(DayOfWeek), ctStart.DayOfWeek.ToString());
       if (iStartDay == 1 && iStartDay == 7)
       {
           return 0;
       }
       if (ctStart < ctMinTime) // start time is befor min time
       {
           ctStart = ctMinTime; // set start time to min time
       }
       TimeSpan ctSpan = ctMaxTime - ctStart;
       daysec = (ctSpan.Days * 24 * 60 * 60) + (ctSpan.Hours * 60 * 60) + (ctSpan.Minutes * 60) + ctSpan.Seconds;
       return daysec;
   }
   private static Int32 CorrectLastDayTime(DateTime ctEnd, DateTime ctMaxTime, DateTime ctMinTime)
   {
       Int32 daysec = 0;

       if (ctMinTime > ctEnd) // start time is after max time
       {
           return 0; // zero seconds for the first day
       }
       int iEndDay = (Int32)Enum.Parse(typeof(DayOfWeek), ctEnd.DayOfWeek.ToString());
       if (iEndDay == 1 && iEndDay == 7)
       {
           return 0;
       }
       if (ctEnd > ctMaxTime) // start time is befor min time
       {
           ctEnd = ctMaxTime; // set start time to min time
       }
       TimeSpan ctSpan = ctEnd - ctMinTime;
       daysec = (ctSpan.Days * 24 * 60 * 60) + (ctSpan.Hours * 60 * 60) + (ctSpan.Minutes * 60) + ctSpan.Seconds;
       return daysec;
   }

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here