2010-04-26 4 views
5

У меня есть функция, которая возвращает мне только пятницы из диапазона датКак получить последнюю пятницу месяца (ы) с помощью .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 - 23 апреля 2010 года, а номер недели - 1, программа должна вернуть даты с 16 апреля 2010 года до начала ».

Я звоню функцию:

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

Более идиоматическая реализация будет использовать '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

Просто небольшое улучшение на ответ Сарат, за исключением тех (как я), кто вступает в этот вопрос

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; 
} 
Смежные вопросы