计算两个日期之间一周中每一天的发生次数

时间:2014-08-15 04:33:01

标签: c# dayofweek

我想计算一周中每一天在两个给定日期之间的事件。

例如:

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

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

6 个答案:

答案 0 :(得分:3)

试试这个:

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

答案 1 :(得分:1)

您最好先将日期转换为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--;
}

然后我们可以返回arrray:

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 }

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

答案 2 :(得分:0)

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

        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);
        }

答案 3 :(得分:0)

简单的方法是在句点中每天循环,并使用switch case或if else来检查当前日期.DayOfWeek计算并保存周数,如下所示:

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

答案 4 :(得分:0)

    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;
    }

答案 5 :(得分:0)

你可以使用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);

FIDDLE:

https://dotnetfiddle.net/ZopkFY