如何使用.NET获得上个星期五的月份

时间:2010-04-26 05:56:24

标签: c# .net c#-3.0

我有一个函数只返回一系列日期的星期五

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日至“startddate”。

我将该函数称为:

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

现在要求发生了一些变化。我只需要找出每个月的最后一个星期五。 该函数的输入将保持不变。

6 个答案:

答案 0 :(得分:6)

您已经拥有给定范围内的星期五列表。现在只需再次查询:

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

希望这有帮助。

答案 1 :(得分: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);
    }
  }
}

答案 2 :(得分:3)

Sarath的回答只是一个小小的改进,对于那些(像我一样)介入这个问题的人

PropertyChanged

答案 3 :(得分:1)

检查下个月第一天的星期几,然后减去足够的天数以获得星期五。

或者,如果您已经有一个星期五列表,请仅返回那些在下个月添加7天的日期。

答案 4 :(得分:0)

根据DeBorges的回答,这是获取任何特定Day的扩展

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

答案 5 :(得分:-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;
}