计算给定日期范围内的星期一数

The*_*eje 23 c# datetime datediff date

鉴于日期范围,我需要知道在该范围内有多少星期一(或星期二,星期三等).

我目前在C#工作.

Jon*_*n B 42

试试这个:

static int CountDays(DayOfWeek day, DateTime start, DateTime end)
{
    TimeSpan ts = end - start;                       // Total duration
    int count = (int)Math.Floor(ts.TotalDays / 7);   // Number of whole weeks
    int remainder = (int)(ts.TotalDays % 7);         // Number of remaining days
    int sinceLastDay = (int)(end.DayOfWeek - day);   // Number of days since last [day]
    if (sinceLastDay < 0) sinceLastDay += 7;         // Adjust for negative days since last [day]

    // If the days in excess of an even week are greater than or equal to the number days since the last [day], then count this one, too.
    if (remainder >= sinceLastDay) count++;          

    return count;
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*rks 20

由于您使用的是C#,如果您使用的是C#3.0,则可以使用LINQ.

假设您有一个包含日期为DateTime类型的Array/List/IQueryable等:

DateTime[] dates = { new DateTime(2008,10,6), new DateTime(2008,10,7)}; //etc....

var mondays = dates.Where(d => d.DayOfWeek == DayOfWeek.Monday); // = {10/6/2008}
Run Code Online (Sandbox Code Playgroud)

添加:

不确定你是否意味着将它们分组并计算它们,但是这里也是如何在LINQ中做到这一点:

var datesgrouped = from d in dates
                   group d by d.DayOfWeek into grouped
                   select new { WeekDay = grouped.Key, Days = grouped };

foreach (var g in datesgrouped)
{
    Console.Write (String.Format("{0} : {1}", g.WeekDay,g.Days.Count());
}
Run Code Online (Sandbox Code Playgroud)

  • 由于两个原因,我认为它被拒绝了1:问题是关于日期范围,而不是日期列表; 所以你的例子不起作用.2:如果你不得不在大范围和大量时间内完成日期范围,则需要很长时间. (7认同)

Cyb*_*ist 18

看看计算星期几的不同算法是很有趣的,而且@Gabe Hollombe在这个主题上指向WP是一个好主意(我记得大约二十年前在COBOL中实现了Zeller的同余),但这是相当的.当他们问到时间是什么时,把某人的蓝图交给他人.

在C#中:

    private int CountMondays(DateTime startDate, DateTime endDate)
    {
        int mondayCount = 0;

        for (DateTime dt = startDate; dt < endDate; dt = dt.AddDays(1.0))
        {
            if (dt.DayOfWeek == DayOfWeek.Monday)
            {
                mondayCount++;
            }
        }

        return mondayCount;
    }
Run Code Online (Sandbox Code Playgroud)

这当然不会评估"星期一"的结束日期,因此如果需要,请进行for循环评估

dt < endDate.AddDays(1.0)
Run Code Online (Sandbox Code Playgroud)

  • 我真的很喜欢你如何使用 DateTime 作为迭代器。 (2认同)

cjm*_*cjm 5

这是一些伪代码:

DifferenceInDays(Start, End) / 7   // Integer division discarding remainder
+ 1 if DayOfWeek(Start) <= DayImLookingFor
+ 1 if DayOfWeek(End)   >= DayImLookingFor
- 1
Run Code Online (Sandbox Code Playgroud)

其中以天为单位DifferenceInDays返回End - Start,并DayOfWeek以整数形式返回星期几。DayOfWeek只要映射不断增加并与匹配,实际上使用什么都没有关系DayImLookingFor

请注意,此算法假定日期范围为包含范围。如果End不属于该范围,则必须稍微调整算法。

剩下的翻译工作是作为练习供读者阅读。