【问题标题】:How to get all weekends within date range in C# [closed]如何在 C# 中获取日期范围内的所有周末 [关闭]
【发布时间】:2014-09-17 17:08:54
【问题描述】:

我只是想知道是否有一种简单的方法或框架可以 在 C# 中获取日期范围内的所有周末?

是否也可以使用 LINQ?

有什么线索吗?

谢谢!

【问题讨论】:

  • 我想这不是太简单,但应该是可能的(包括使用 LINQ)。祝你好运!
  • 超人,现在你应该知道“是 可能”的答案几乎总是“是”。我怀疑你想让别人教你怎么做。如果您正在寻找这个问题,那么您应该问这个问题。

标签: c# .net date-range dayofweek weekend


【解决方案1】:

我找到了方法。

http://www.dotnetjalps.com/2011/06/finding-saturdaysunday-between-date.html

namespace DatimeApplication
{
   class Program
   {
       static void Main(string[] args)
       {
             DateTime startDate=new DateTime(2011,3,1);
             DateTime endDate = DateTime.Now;

             TimeSpan diff = endDate - startDate;
             int days = diff.Days;
             for (var i = 0; i <= days; i++)
             {
                 var testDate = startDate.AddDays(i);
                 switch (testDate.DayOfWeek)
                 {
                     case DayOfWeek.Saturday:
                     case DayOfWeek.Sunday:
                         Console.WriteLine(testDate.ToShortDateString());
                         break;
                 }
             }
           Console.ReadLine();
       }
   }
}

【讨论】:

    【解决方案2】:

    这并不难编码...这是一个高效的迭代器:

    public static IEnumerable<DateTime> GetWeekends(DateTime startDate, DateTime endDate)
    {
        startDate = startDate.Date;
        endDate = endDate.Date;
    
        if (endDate < startDate)
            yield break;
    
        var currentDate = startDate;
    
        // Advance to next Saturday
        switch (currentDate.DayOfWeek)
        {
            case DayOfWeek.Saturday:
                break;
    
            case DayOfWeek.Sunday:
                yield return currentDate;
                currentDate = currentDate.AddDays(6);
                break;
    
            default:
                currentDate = currentDate.AddDays(DayOfWeek.Saturday - currentDate.DayOfWeek);
                break;
        }
    
        while (currentDate <= endDate)
        {
            yield return currentDate;
    
            currentDate = currentDate.AddDays(1);
            if (currentDate <= endDate)
                yield return currentDate;
    
            currentDate = currentDate.AddDays(6);
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果你想办法枚举所有的日子,你可以使用 linq 过滤到周末:

      IEnumerable<DateTime> GetDaysBetween(DateTime start, DateTime end)
      {
          for (DateTime i = start; i < end; i = i.AddDays(1))
          {
              yield return i;
          }
      }
      
      var weekends = GetDaysBetween(DateTime.Today, DateTime.Today.AddDays(365))
          .Where(d => d.DayOfWeek == DayOfWeek.Saturday || d.DayOfWeek == DayOfWeek.Sunday);
      

      【讨论】:

      • 想知道为什么这被否决了,对我来说看起来不错,虽然它比其他一些解决方案更耗电(避免整天枚举只是为了过滤它们)它是一个非常简单/干净/可维护的解决方案一个不太可能成为瓶颈的问题,除非 OP 在数千年的时间里工作。投票补偿。
      • The Fastest Gun in the West 拍自己的脚:它被否决(不是我),因为当答案首次发布时,它的格式错误且不完整。没有修订,因为 Mitch 修复它的速度足够快,以至于 SO 不认为它是修订版,但其他人看到它并否决它的速度没有那么快
      • 是的,我什至没有想快点...在我还在写的时候点击 tab space
      • @RonanThibaudau,这实际上是我之前测试过的东西。尽管您可能想象到性能明显下降,但我发现在大多数测试中,naïve 版本实际上优于“智能”版本。这些测试侧重于日期模数,所以我不能说它们在使用 DayOfWeek 枚举时是否同样适用。然而,我确实同意“程序应该是为人们阅读而编写的,并且只是偶然地让机器执行。”
      • @Mitch 我实际上支持这一点,性能下降会很小(每周增加 5 次 adddays 调用,而智能版本则没有),因此可以更快,但我们'正在谈论的数量极少,除非在紧密的循环中,否则无关紧要(我只是为周末编写了一个快速的特定版本,并在 1000 年内对您的版本进行了 100 次测试,您的版本为 2700 毫秒,而我的版本为 600 毫秒,结果相同,但这仍然无关紧要,因为大多数人不会尝试在接下来的 1000 年中连续 100 次获得所有周末)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 2022-01-23
      • 2011-03-22
      • 1970-01-01
      相关资源
      最近更新 更多