Как получить последнюю пятницу месяца (ов), используя .NET - PullRequest
5 голосов
/ 26 апреля 2010

У меня есть функция, которая возвращает мне только пятницы из диапазона дат

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

Назначение функции:"Список дат от номера недели, указанного до начальной даты, т.е. если начальная дата 23 апреля 2010 года и номер недели 1, то программа должна вернуть даты 16 Апрель 2010 до старта ".

Я вызываю функцию как:

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

Теперь требование немного изменилось. Мне нужно узнавать только последние пятницы каждого месяца. Вход в функцию останется прежним.

Ответы [ 6 ]

6 голосов
/ 26 апреля 2010

У вас уже есть список пятниц в указанном диапазоне. Теперь просто запросите это снова так:

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

Надеюсь, это поможет.

4 голосов
/ 19 апреля 2011

Вот метод расширения, который мы используем.

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);
    }
  }
}
3 голосов
/ 14 января 2016

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

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;
}
1 голос
/ 26 апреля 2010

Проверьте, в какой день недели включается первый день следующего месяца, затем вычтите достаточно дней, чтобы получить пятницу.

Или, если у вас уже есть список пятниц, возвращайте только те, для которых добавление 7 дней дает дату в следующем месяце.

0 голосов
/ 03 июля 2018

На основании ответа Деборжа, вот расширение для получения любого конкретного дня

public static DateTime GetLastSpecificDayOfTheMonth(this DateTime date, DayOfWeek dayofweek)
    {
        var lastDayOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));

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

        return lastDayOfMonth;
    }
0 голосов
/ 11 декабря 2014

Вызовите функцию ниже, отправив дату в качестве параметра, в котором она извлекает месяц и год из параметра даты и возвращает последний 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;
}
...