【问题标题】:Count occurrence for each day of the week between two dates计算两个日期之间一周中每一天的发生次数
【发布时间】:2014-08-15 04:33:01
【问题描述】:

我想计算两个给定日期之间一周中每一天的发生次数。

例如:

在 2014 年 7 月 20 日至 2014 年 7 月 27 日之间,为期 8 天,有:

星期日=2,星期一=1,星期二=1,...

【问题讨论】:

标签: c# dayofweek


【解决方案1】:

试试这个:

DateTime start = new DateTime(2014,07,20);
DateTime end = new DateTime(2014,07,27);
TimeSpan ts = end - start;
int limit = ts.Days;
var result = Enumerable.Range(0,limit+1)
            .Select(x => start.AddDays(x))
            .GroupBy(x => x.DayOfWeek)
            .Select(x => new {day = x.Key, count = x.Count()});

我们创建一个从开始到结束的日期范围,包括两个日期,然后按星期几分组以获得日期和相应的计数。

Demo

【讨论】:

    【解决方案2】:

    您最好先将日期转换为 DateTime 实例:

    DateTime d1 = new DateTime(2014,07,20);
    DateTime d2 = new DateTime(2014,07,27);
    

    接下来计算两个日期之间的总天数:

    int days = (int) Math.Floor((d2-d1).TotalDays)+1;
    

    以及第一个日期的星期几:

    int dow = (int) d1.DayOfWeek;
    

    现在我们将天数除以 7 并将该数字分配给所有天:因为这是每天的最少发生次数:

    int d7 = days/7;
    int[] counts = new int[7];
    for(int i = 0; i < 7; i++) {
        counts[i] = d7;
    }
    

    剩余的天数以d1的星期几分配:

    int remainder = days-7*d7;
    int dowi = dow;
    while(remainder > 0) {
        counts[dowi]++;
        dowi = (dowi+1)%7;//next day of the week
        remainder--;
    }
    

    然后我们可以返回数组:

    return counts;
    

    完整方法:

    public static int[] countDelta (DateTime d1, DateTime d2) {
        int days = (int) Math.Floor((d2-d1).TotalDays)+1;
        int dow = (int) d1.DayOfWeek;
        int d7 = days/7;
        int[] counts = new int[7];
        for(int i = 0; i < 7; i++) {
            counts[i] = d7;
        }
        int remainder = days-7*d7;
        int dowi = dow;
        while(remainder > 0) {
            counts[dowi]++;
            dowi = (dowi+1)%7;//next day of the week
            remainder--;
        }
        return counts;
    }
    

    csharp 交互式会话的结果:

    csharp> Foo.countDelta(new DateTime(2014,07,20),new DateTime(2014,07,27));
    { 2, 1, 1, 1, 1, 1, 1 }
    

    该方法以恒定时间运行(如果日期相差很大,这不会对性能产生影响)。唯一的限制是日历必须是现代的:如果在历史的某个地方,人们跳过了“一周中的几天”,这可能会导致一些问题。

    【讨论】:

      【解决方案3】:

      你可以试试这样的。这可能不是最好的解决方案,但它是第一个想到的:

              var startDate = DateTime.Now;
              var endDate = startDate.AddDays(15);
      
              var rusultDictionary = new Dictionary<DayOfWeek, int>();
      
              while (!startDate.Date.Equals(endDate.Date))
              {
                  rusultDictionary[startDate.DayOfWeek] = rusultDictionary.ContainsKey(startDate.DayOfWeek) ? rusultDictionary[startDate.DayOfWeek] + 1 : 1;
                  startDate = startDate.AddDays(1);
              }
      

      【讨论】:

        【解决方案4】:

        简单的方法是在周期内的每一天循环,使用switch case或者if else来检查当前日期。DayOfWeek来统计并保存周数,如下:

        int mondays = 0;
        switch(current.DayOfWeek){
            case DayOfWeek.Monday:
                 mondays++;
            break;
            ...
        }
        

        【讨论】:

        • 日期相差几天(周、月)的时候很好,但是如果要计算'90/1/15'14/7/15之间的差异,这种方法会花费很长时间。跨度>
        【解决方案5】:
            public static Dictionary<DayOfWeek, int> CountDayOfWeeks(DateTime @from, DateTime to)
            {
                var start = @from.Date;
        
                var ret = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>().ToDictionary(x => x, x => 0);
        
                while (start <= to)
                {
                    ret[start.DayOfWeek]++;
                    start = start.AddDays(1);
                }
        
                return ret;
            }
        

        【讨论】:

          【解决方案6】:

          你可以使用 Linq 实现它:

          DateTime StartDate = DateTime.Now.AddDays(-14);
          DateTime EndDate = DateTime.Now;
          DayOfWeek day = DayOfWeek.Monday;
          

          首先获取两个日期之间的所有天数:

          List<DateTime> dates = Enumerable.Range(0, (int)((EndDate - StartDate).TotalDays) + 1)
                                .Select(n => StartDate.AddDays(n))
                                .ToList();
          

          现在获取以日为基准的计数,目前它将获取星期一的计数:

          var MondayCount = dates.Count(x => x.DayOfWeek == day);
          

          小提琴:

          https://dotnetfiddle.net/ZopkFY

          【讨论】:

            猜你喜欢
            • 2012-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-08
            相关资源
            最近更新 更多