2010-12-19 113 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);