计算2个日期之间的包含周数

Gui*_*doG 2 c#

我需要获得2个日期之间的周数.
对我来说一周是星期一到星期天.
因此,如果第一个日期是在星期六,那么应该包括本周.
如果第二个日期是星期一,那么应该包括本周.

最有效的方法是什么?

例如:

startdate   enddate      nbr of weeks
17/09/2016  26/09/2016   3 weeks
17/09/2016  25/09/2016   2 weeks
19/09/2016  26/09/2016   2 weeks
12/09/2016  25/09/2016   2 weeks
Run Code Online (Sandbox Code Playgroud)

我找到了很多答案,例如这个如何计算2个日期的周数?但他们最终都将天数除以7而这并没有给出我需要的结果.

Jon*_*eet 7

最简单的方法可能是编写一个方法来获得一周的开始.然后,您可以从另一个日期中减去一个日期,将天数除以7并添加1(以使其包含在内).

就个人而言,我会将Noda Time用于所有这些,但使用DateTime:

// Always uses Monday-to-Sunday weeks
public static DateTime GetStartOfWeek(DateTime input)
{
    // Using +6 here leaves Monday as 0, Tuesday as 1 etc.
    int dayOfWeek = (((int) input.DayOfWeek) + 6) % 7;
    return input.Date.AddDays(-dayOfWeek);
}

public static int GetWeeks(DateTime start, DateTime end)
{
    start = GetStartOfWeek(start);
    end = GetStartOfWeek(end);
    int days = (int) (end - start).TotalDays;
    return (days / 7) + 1; // Adding 1 to be inclusive
}
Run Code Online (Sandbox Code Playgroud)

完整的例子:

using System;

class Program
{
    static void Main (string[] args)
    {
        ShowWeeks(new DateTime(2016, 9, 17), new DateTime(2016, 9, 26));
        ShowWeeks(new DateTime(2016, 9, 17), new DateTime(2016, 9, 25));
        ShowWeeks(new DateTime(2016, 9, 19), new DateTime(2016, 9, 26));
        ShowWeeks(new DateTime(2016, 9, 12), new DateTime(2016, 9, 25));
    }

    static void ShowWeeks(DateTime start, DateTime end)
    {
        int weeks = GetWeeks(start, end);
        Console.WriteLine($"{start:d} {end:d} {weeks}");
    }

    // Always uses Monday-to-Sunday weeks
    public static DateTime GetStartOfWeek(DateTime input)
    {
        // Using +6 here leaves Monday as 0, Tuesday as 1 etc.
        int dayOfWeek = (((int) input.DayOfWeek) + 6) % 7;
        return input.Date.AddDays(-dayOfWeek);
    }

    public static int GetWeeks(DateTime start, DateTime end)
    {
        start = GetStartOfWeek(start);
        end = GetStartOfWeek(end);
        int days = (int) (end - start).TotalDays;
        return (days / 7) + 1; // Adding 1 to be inclusive
    }
}
Run Code Online (Sandbox Code Playgroud)

输出(在我的英国语言环境中):

17/09/2016 26/09/2016 3
17/09/2016 25/09/2016 2
19/09/2016 26/09/2016 2
12/09/2016 25/09/2016 2
Run Code Online (Sandbox Code Playgroud)


Sla*_*lai 5

有点“简化”,因为星期一只需要开始日期:

static int weeks(DateTime d1, DateTime d2) { 
    var daysSinceMonday = ((int)d1.DayOfWeek + 6) % 7;
    return ((d2 - d1).Days + daysSinceMonday) / 7 + 1; 
}
Run Code Online (Sandbox Code Playgroud)