2010-04-26 2 views
5

의 지난 금요일 얻을 수 I이어떻게 달 (들)를 사용하여 .NET

public static List<DateTime> GetDates(DateTime startDate, int weeks) 
{ 
    int days = weeks * 7; 

    //Get the whole date range 
    List<DateTime> dtFulldateRange = Enumerable.Range(-days, days).Select(i => startDate.AddDays(i)).ToList(); 

    //Get only the fridays from the date range 
    List<DateTime> dtOnlyFridays = (from dtFridays in dtFulldateRange 
            where dtFridays.DayOfWeek == DayOfWeek.Friday 
            select dtFridays).ToList(); 
    return dtOnlyFridays; 
} 

목적 함수의 날짜 범위에서 날에만 금요일을 반환하는 함수 : 날짜의 "목록에서 StartDate까지 지정된 주 번호 예 : startdate가 2010 년 4 월 23 일이고 주 번호가 1이면 프로그램은 2010 년 4 월 16 일부터 시작일까지 날짜를 반환해야합니다. "

DateTime StartDate1 = DateTime.ParseExact("20100430", "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); 
List<DateTime> dtList = Utility.GetDates(StartDate1, 4).ToList(); 

지금 요구 사항이 조금 변경되었습니다로

나는 함수를 호출하고있다. 매월 마지막 금요일 만 찾아야합니다. 함수에 대한 입력은 동일하게 유지됩니다.

+0

@Newbie : C#의 버전은 중요하지만 .NET의 버전이기 때문에 C# 자체는 도움이되지 않습니다. .NET Framework가 필요합니다. –

+0

숙제입니까? –

+0

더 관용적 인 구현은 모든 것을'List '로 변환하는 대신'IEnumerable '을 사용합니다. –

답변

6

이미 지정된 범위의 금요일 목록이 있습니다. 이제 다음과 같이 다시 쿼리하십시오.

List<DateTime> lastFridays = (from day in fridays 
           where day.AddDays(7).Month != day.Month 
           select day).ToList<DateTime>(); 

희망이 있습니다.

1

다음 요일의 첫 번째 요일을 확인한 다음 금요일을 얻기에 충분한 일수를 뺍니다.

또는 이미 금요일 목록이있는 경우 7 일을 추가 한 날짜가 다음 달에있는 날짜 만 반환하십시오.

4

다음은 우리가 사용하는 확장 방법입니다. 다음은

public static class DateTimeExtensions 
{ 
    public static DateTime GetLastFridayInMonth(this DateTime date) 
    { 
     var firstDayOfNextMonth = new DateTime(date.Year, date.Month, 1).AddMonths(1); 
     int vector = (((int)firstDayOfNextMonth.DayOfWeek + 1) % 7) + 1; 
     return firstDayOfNextMonth.AddDays(-vector); 
    } 
} 

은 MbUnit에 테스트 케이스

[TestFixture] 
public class DateTimeExtensionTests 
{ 
    [Test] 
    [Row(1, 2011, "2011-01-28")] 
    [Row(2, 2011, "2011-02-25")] 
    ... 
    [Row(11, 2011, "2011-11-25")] 
    [Row(12, 2011, "2011-12-30")] 
    [Row(1, 2012, "2012-01-27")] 
    [Row(2, 2012, "2012-02-24")] 
    ... 
    [Row(11, 2012, "2012-11-30")] 
    [Row(12, 2012, "2012-12-28")] 

    public void Test_GetLastFridayInMonth(int month, int year, string expectedDate) 
    { 
    var date = new DateTime(year, month, 1); 
    var expectedValue = DateTime.Parse(expectedDate); 

    while (date.Month == month) 
    { 
     var result = date.GetLastFridayInMonth(); 
     Assert.AreEqual(expectedValue, result); 
     date = date.AddDays(1); 
    } 
    } 
} 
-1

전화는 날짜 매개 변수에서 월과 연도를 추출하고 그 마지막 Friday 반환하는 매개 변수로 날짜를 전송하여 아래의 기능입니다 달

public DateTime GetLastFridayOfMonth(DateTime dt) 
{ 
     DateTime dtMaxValue = DateTime.MaxValue; 
     DateTime dtLastDayOfMonth = new DateTime(dt.Year, dt.Month, DateTime.DaysInMonth(dt.Year, dt.Month)); 

     while (dtMaxValue == DateTime.MaxValue) 
     { 
      // Returns if the decremented day is the fisrt Friday from last(ie our last Friday) 
      if (dtMaxValue == DateTime.MaxValue && dtLastDayOfMonth.DayOfWeek == DayOfWeek.Friday) 
       return dtLastDayOfMonth; 
      // Decrements last day by one 
      else 
       dtLastDayOfMonth = dtLastDayOfMonth.AddDays(-1.0); 
     } 
     return dtLastDayOfMonth; 
} 
+0

왜 DateTime.MaxValue를 사용합니까? – ColinM

+0

@ColinM 상수로 사용되는 것 같습니다. 매우 까다 롭긴하지만 'while (true) {...}'을하는 것과 같습니다. 또한 값이 변경되었는지 여부를 불필요하게 검사합니다. –

1

Sarath의 대답에 그냥 작은 개선이 질문에 들어 서면 사람 (나 같은) 사람들을 위해

,
private DateTime GetLastFridayOfTheMonth(DateTime date) 
{ 
    var lastDayOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month)); 

    while (lastDayOfMonth.DayOfWeek != DayOfWeek.Friday) 
     lastDayOfMonth = lastDayOfMonth.AddDays(-1); 

    return lastDayOfMonth; 
}