2010-12-19 112 views
2

如何获得C#中没有星期五和星期六的一个月内的天数?如何在没有周末的情况下获取DateTime.DaysInMonth?

+0

那么你会只是迭代每一天,每个星期五和星期六从一个计数器初始化为常规DaysInMonth我猜,删除1。 – 2010-12-19 09:24:45

+2

@Camilo Martin - 你的意思是'每天迭代'? DateTime.DaysInMonth检索一个int而不是一个集合。 – Erez 2010-12-19 09:38:35

+0

[.NET日期比较:计算自日期以来的工作天数?](http://stackoverflow.com/questions/165887/net-date-compare-count-the-amount-of-working- days-since-a-date) – Oded 2010-12-19 09:44:45

回答

6

这里,快速和肮脏的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     int month = DateTime.Today.Month; 
     int year = DateTime.Today.Year; 

     int daysInMonthMinusFridayAndSaturday = 0; 

     for (int i = 1; i <= DateTime.DaysInMonth(year,month); i++) 
     { 
      DateTime thisDay = new DateTime(year,month,i); 
      if(thisDay.DayOfWeek != DayOfWeek.Friday && thisDay.DayOfWeek != DayOfWeek.Saturday) 
      { 
       daysInMonthMinusFridayAndSaturday += 1; 
      } 
     } 

     Console.WriteLine(daysInMonthMinusFridayAndSaturday); 
     Console.ReadLine(); 
    } 
} 
1

我会避免循环或迭代,做这样的:

int GetWorkDays(int year, int month) 
{ 
    var firstDayOfMonth = new DateTime(year, month, 1).DayOfWeek; 
    var daysInMonth = DateTime.DaysInMonth(year, month); 

    // count whole weeks first    
    var wholeWeeks = daysInMonth/7; 
    var extraDays = daysInMonth % 7; 

    // calculate the overlap of the "remainder days" with the weekend. 
    var lastDayOfMonth = (int) (firstDayOfMonth + extraDays - 1); 
    var overlapStart = Math.Max((int) firstDayOfMonth, (int) DayOfWeek.Friday); 
    var overlapEnd = Math.Min(lastDayOfMonth, (int) DayOfWeek.Saturday); 
    var weekendOverlap = Math.Max(0, overlapEnd - overlapStart + 1); 

    // substract weekend days 
    return daysInMonth - wholeWeeks * 2 - weekendOverlap; 
} 
+0

为什么要关心一些如此简单的性能的一点点?这并不是说最糟糕的情况下会花费几个毫秒。 – 2010-12-19 10:18:38

+1

@Camilo Martin:因为它更好:)我同意没有现实生活中的意义。至少在有人发明真正漫长的月份之前。 – Ran 2010-12-19 10:20:34

6

强制性LINQ的解决方案:

int days = Enumerable.Range(1, DateTime.DaysInMonth(year, month)) 
        .Select(day => new DateTime(year, month, day)) 
        .Count(d => d.DayOfWeek != DayOfWeek.Saturday && 
            d.DayOfWeek != DayOfWeek.Friday); 
相关问题