我想计算一周中每一天在两个给定日期之间的事件。
例如:
2014年7月20日至2014年7月27日,为期8天,有:
星期日= 2,星期一= 1,星期二= 1,......
答案 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()});
我们从开始到结束创建一系列日期,包括两个日期,然后按星期几分组,以获取日期和相应的计数。
答案 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);