将星期六 DateTime 向前 4 周,向后 13 周

Get Saturday DateTime 4 weeks forward, and 13 weeks back

我正在尝试创建一个 DateTime 对象的自定义集合,这些对象表示从当前日期时间到 4 周后和 13 周后的所有星期六。我正在尝试根据集合顶部的当前日期时间最近的那个来排序这个集合。

TIA!

试试下面的代码。

它从当前日期起迭代 -13+4 周所需的周数,并将具体日期调整为您需要的那一天(在本例中为 Saturday

for (int i = -13; i <= 4; i++)
{
    var dateBackWithIWeeks = DateTime.Now.AddDays(i * 7);
    switch (dateBackWithIWeeks.DayOfWeek)
    {
        case DayOfWeek.Sunday:
            dateBackWithIWeeks = dateBackWithIWeeks.AddDays(-1);
            break;
        case DayOfWeek.Monday:
            dateBackWithIWeeks = dateBackWithIWeeks.AddDays(5);
            break;
        case DayOfWeek.Tuesday:
            dateBackWithIWeeks = dateBackWithIWeeks.AddDays(4);
            break;
        case DayOfWeek.Wednesday:
            dateBackWithIWeeks = dateBackWithIWeeks.AddDays(3);
            break;
        case DayOfWeek.Thursday:
            dateBackWithIWeeks = dateBackWithIWeeks.AddDays(2);
            break;
        case DayOfWeek.Friday:
            dateBackWithIWeeks = dateBackWithIWeeks.AddDays(1);
            break;
        case DayOfWeek.Saturday:
            break;
    }

    Console.WriteLine(dateBackWithIWeeks.Date);
}

根据评论更新

注意:代码可能需要根据您定义“13 周前”(和“4 周后”)的方式进行调整 - 您考虑的是日历周,还是 13 * 7 天?下面的代码回顾了 13 * 7 天。

这是一种方法:

  1. 创建今天减去 13 周的开始日期
  2. 将开始日期调整为下周六(如果不是周六)
  3. 创建今天加上 4 周的结束日期
  4. 从开始到结束每 7 天,将这一天添加到列表中
  5. 按日期降序排列列表

这是一个示例实现:

var saturdays = new List<DateTime>();
var daysInWeek = 7;

var startDate = DateTime.Today.Subtract(TimeSpan.FromDays(13 * daysInWeek));

// Adjust start date so it is the first Saturday after 13 weeks before today
startDate = startDate.AddDays(DayOfWeek.Saturday - startDate.DayOfWeek);

var endDate = DateTime.Today.Add(TimeSpan.FromDays(4 * daysInWeek));

for (var curDate = startDate; curDate <= endDate; curDate = curDate.AddDays(daysInWeek))
{
    saturdays.Add(curDate);
}

// Order by date, descending
saturdays = saturdays.OrderByDescending(d => d).ToList();

// Output list of Saturdays to console for verification
saturdays.ForEach(s => Console.WriteLine(s.ToShortDateString()));

这个怎么样:

public static void Main()
{
    var start = DateTime.Now;
    var saturdays = GetSaturdays(start, 13, 4).OrderBy(d => Math.Abs((start - d).Days));
    foreach (var s in saturdays) 
    {
        Console.WriteLine(s.ToLongDateString());
    }
}

public static IEnumerable<DateTime> GetSaturdays(DateTime start, int weeksBack, int weeksForward)
{
    var startingSat = start.AddDays(6 - (int)start.DayOfWeek);
    for (int i = -weeksBack; i < weeksForward; i++)
    {
        yield return startingSat.AddDays(i * 7);
    }
}

您的问题仍然有点不清楚您希望这些如何排序,但您可以更改排序以反映您想要的任何内容。听起来您希望它们按照与开始日期的接近程度来排序,这几乎肯定没有意义。如果你只是想让它们按日期降序排列(如果那是你 实际上 想要的,你应该这么说)然后只需将 OrderBy 替换为:

.OrderByDescending(d => d);

这是一个fiddle

List<DateTime> saturdays = new List<DateTime>();
for (int i = -13; i < 4; i++)
    saturdays.Add(DateTime.Now.AddDays(i * 7 - (DateTime.Now.DayOfWeek - DayOfWeek.Saturday)));
DateTime today = DateTime.Now;
var more_recent = saturdays.OrderBy(day => Math.Abs(today.Subtract(day).Days)).ToList();