Calculate the number of business days between two dates?

后端 未结 30 1169
悲&欢浪女
悲&欢浪女 2020-11-22 14:54

In C#, how can I calculate the number of business (or weekdays) days between two dates?

30条回答
  •  囚心锁ツ
    2020-11-22 15:50

    I used the following code to also take in to account bank holidays:

    public class WorkingDays
    {
        public List GetHolidays()
        {
            var client = new WebClient();
            var json = client.DownloadString("https://www.gov.uk/bank-holidays.json");
            var js = new JavaScriptSerializer();
            var holidays = js.Deserialize >(json);
            return holidays["england-and-wales"].events.Select(d => d.date).ToList();
        }
    
        public int GetWorkingDays(DateTime from, DateTime to)
        {
            var totalDays = 0;
            var holidays = GetHolidays();
            for (var date = from.AddDays(1); date <= to; date = date.AddDays(1))
            {
                if (date.DayOfWeek != DayOfWeek.Saturday
                    && date.DayOfWeek != DayOfWeek.Sunday
                    && !holidays.Contains(date))
                    totalDays++;
            }
    
            return totalDays;
        }
    }
    
    public class Holidays
    {
        public string division { get; set; }
        public List events { get; set; }
    }
    
    public class Event
    {
        public DateTime date { get; set; }
        public string notes { get; set; }
        public string title { get; set; }
    }
    

    And Unit Tests:

    [TestClass]
    public class WorkingDays
    {
        [TestMethod]
        public void SameDayIsZero()
        {
            var service = new WorkingDays();
    
            var from = new DateTime(2013, 8, 12);
    
            Assert.AreEqual(0, service.GetWorkingDays(from, from));
    
        }
    
        [TestMethod]
        public void CalculateDaysInWorkingWeek()
        {
            var service = new WorkingDays();
    
            var from = new DateTime(2013, 8, 12);
            var to = new DateTime(2013, 8, 16);
    
            Assert.AreEqual(4, service.GetWorkingDays(from, to), "Mon - Fri = 4");
    
            Assert.AreEqual(1, service.GetWorkingDays(from, new DateTime(2013, 8, 13)), "Mon - Tues = 1");
        }
    
        [TestMethod]
        public void NotIncludeWeekends()
        {
            var service = new WorkingDays();
    
            var from = new DateTime(2013, 8, 9);
            var to = new DateTime(2013, 8, 16);
    
            Assert.AreEqual(5, service.GetWorkingDays(from, to), "Fri - Fri = 5");
    
            Assert.AreEqual(2, service.GetWorkingDays(from, new DateTime(2013, 8, 13)), "Fri - Tues = 2");
            Assert.AreEqual(1, service.GetWorkingDays(from, new DateTime(2013, 8, 12)), "Fri - Mon = 1");
        }
    
        [TestMethod]
        public void AccountForHolidays()
        {
            var service = new WorkingDays();
    
            var from = new DateTime(2013, 8, 23);
    
            Assert.AreEqual(0, service.GetWorkingDays(from, new DateTime(2013, 8, 26)), "Fri - Mon = 0");
    
            Assert.AreEqual(1, service.GetWorkingDays(from, new DateTime(2013, 8, 27)), "Fri - Tues = 1");
        }
    }
    

提交回复
热议问题