【问题标题】:Count number of including weeks between 2 dates计算两个日期之间的周数
【发布时间】:2016-09-30 09:44:40
【问题描述】:

我需要获取两个日期之间的周数。
我的一周是周一到周日。
因此,如果第一次约会是在星期六,则应该包括本周。
如果第二个日期是星期一,则应包括本周。

最有效的方法是什么?

例子:

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

我为此找到了很多答案,例如how to calculate number of weeks given 2 dates?,但他们最终都将天数除以 7,这并没有给出我需要的结果。

【问题讨论】:

  • @Roy_Dorsthorst:我不明白这将如何成为解决方案的一部分。这只是格式化 - 它与计算日期之间的差异无关。

标签: c#


【解决方案1】:

最简单的方法可能是编写一个方法来获取一周的开始。然后您可以从另一个日期中减去一个日期,将天数除以 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
}

完整示例:

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

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

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

【讨论】:

  • GetEndOfWeek 是拼写错误,或者您遗漏了一个方法。
  • @Abion47:错字 - 现已修复。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    请参阅下面的方法,我将几周“拉伸”到周一到周日,然后计算总天数 / 7

        public static void Main(string[] args)
        {
            Console.WriteLine(CalculateWeeks(new DateTime(2016, 9, 17), new DateTime(2016, 9, 26)));
            Console.WriteLine(CalculateWeeks(new DateTime(2016, 9, 17), new DateTime(2016, 9, 25)));
            Console.WriteLine(CalculateWeeks(new DateTime(2016, 9, 19), new DateTime(2016, 9, 26)));
            Console.WriteLine(CalculateWeeks(new DateTime(2016, 9, 12), new DateTime(2016, 9, 25)));
    
        }
    
        public static double CalculateWeeks(DateTime from, DateTime to)
        {
            if (to.DayOfWeek != DayOfWeek.Sunday)
                to = to.Add(new TimeSpan(7- (int) to.DayOfWeek, 0, 0, 0)).Date;
            return Math.Ceiling((to - from.Subtract(new TimeSpan((int)from.DayOfWeek - 1, 0, 0, 0)).Date).TotalDays / 7);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2011-04-17
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      相关资源
      最近更新 更多