【问题标题】:C# - Get days between 2 datesC# - 获取两个日期之间的天数
【发布时间】:2015-08-24 05:25:55
【问题描述】:

我的案例场景是用户选择一个财政年度,比如 2015 年 1 月 1 日至 2015 年 12 月 31 日。然后他选择天说'星期六','星期天'。

我想获取上述条件之间的所有日期。

我可以得到这样的日期:-

    ....
    for (var date = fromDate; date <= toDate; date = date.AddDays(1))
         temp.Add(date);        

但是如何从日期范围中仅获取“星期六”、“星期日”天?

【问题讨论】:

    标签: c# datetime


    【解决方案1】:

    使用DayOfWeek 属性:

     for (var date = fromDate; date <= toDate; date = date.AddDays(1))
     {
         if (date.DayOfWeek == DayOfWeek.Sunday || date.DayOfWeek == DayOfWeek.Saturday) 
                temp.Add(date);
     }
    

    如果一组星期几不是静态的:

    HashSet<DayOfWeek> daysOfWeek = new HashSet<DayOfWeek> { DayOfWeek.Saturday, DayOfWeek.Sunday };
    List<DateTime> temp = new List<DateTime>();
    for (var date = fromDate.Date; date <= toDate; date = date.AddDays(1))
        if (daysOfWeek.Contains(date.DayOfWeek))
            temp.Add(date);
    

    【讨论】:

    • DayOfWeek 每次都不一样。万一不一样呢?
    • @Backs 哦,不需要,但谢谢 ;D。堆栈溢出是我可以编写一些程序的原因哈哈,我只是回答一些谢谢:D
    • 如果用户选择DayMondayTuesday 或者可能是一周中的所有日子,那么上面的代码将不起作用。那怎么处理呢?
    • @UlugbekUmirov HashSet 应该是比构建新的DayOfWeek 标志更简单的解决方案
    • @Anup 这个答案对你来说是正确的还是我应该改进它?
    【解决方案2】:
    var fromDate = new DateTime(2015, 1, 1);
    var toDate = new DateTime(2015, 2, 15);
    var dates = Enumerable.Range(0, (int)(toDate - fromDate).TotalDays + 1)
        .Select(i => fromDate.AddDays(i))
        .Where(i => i.DayOfWeek == DayOfWeek.Saturday || i.DayOfWeek == DayOfWeek.Sunday);
    
    
    foreach(var date in dates)
    {
        Console.WriteLine("{0:yyyy-MM-dd ddd}", date);
    }
    

    .Net fiddle

    【讨论】:

      【解决方案3】:

      循环很简单,可以完成工作,但 Linq 更有趣。

      但是@Eric:为什么是标志?您可以直接选择工作日:

      DateTime fromDate = new DateTime(2015, 1, 1);
      DateTime toDate = new DateTime(2015, 2, 15);
      DateTime[] dates = Enumerable.Range(0, (int)toDate.Subtract(fromDate).TotalDays + 1)
          .Select(i => fromDate.AddDays(i))
          .Where(i => (i.DayOfWeek == DayOfWeek.Monday || i.DayOfWeek == DayOfWeek.Sunday)).ToArray();
      
      
      foreach(DateTime date in dates)
      {
          Console.WriteLine("{0:yyyy-MM-dd ddd}", date);
      }
      

      【讨论】:

        【解决方案4】:

        你可以使用TimeSpan

        timespan p = new timespan();
        p = dt2-dt1;
        MessageBox.Show(p.days.tostring());
        

        【讨论】:

          猜你喜欢
          • 2020-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-05
          • 1970-01-01
          • 2012-12-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多