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

New*_*bie 5 .net c# 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;
}
Run Code Online (Sandbox Code Playgroud)

功能目的: "从指定的周数到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();
Run Code Online (Sandbox Code Playgroud)

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

DeB*_*ges 7

对于那些进入这个问题的人(像我一样)来说,对萨拉斯的答案只是一个小小的改进

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;
}
Run Code Online (Sandbox Code Playgroud)


dan*_*ish 6

您已经拥有给定范围内的星期五列表.现在再次查询这个:

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

希望这可以帮助.


小智 5

这是我们正在使用的扩展方法。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是 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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)