2010-12-19 3 views
2

금요일과 토요일이없는 달의 일수를 C#으로 얻으려면 어떻게해야합니까? 내가 루프 나 반복을 방지하고 이런 식으로 할 것주말없이 DateTime.DaysInMonth을 얻으려면 어떻게해야합니까?

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(); 
    } 
} 
+0

매일 매일 반복하고 카운터에서 매일 금요일과 토요일마다 1을 제거합니다. 내가 추측 한 일반 DaysInMonth로 초기화됩니다. –

+2

@Camilo Martin - '매일 반복'이란 무엇입니까? DateTime.DaysInMonth는 컬렉션이 아닌 int를 검색합니다. – Erez

+0

가능한 중복 [.NET 날짜 비교 : 날짜 이후 근무일을 계산 하시겠습니까?] (http://stackoverflow.com/questions/165887/net-date-compare-count-the-amount-of-working- days-since-a-date) – Oded

답변

6

, 그럼 당신은 좋겠

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); 
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

왜 그렇게 간단한 일에 약간의 성능에 관심을? 그것은 최악의 상황에서 몇 밀리 초 이상 걸릴 것 같지 않습니다. –

+1

@Camilo Martin : 더 좋기 때문에 :) 나는 실제적인 의미가 없다는 데 동의한다. 적어도 누군가가 정말로 긴 개월을 발명 할 때까지. – Ran

6

필수 LINQ 솔루션 : 신속하고 더러운 여기

관련 문제