2016-09-30 82 views
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 

我找到了這麼多答案,像這樣的例如how to calculate number of weeks given 2 dates?但他們都最終與分割天7,並且不給出結果,我需要。

+0

@Roy_Dorsthorst:我看不出這將是部分解。這只是格式化 - 它與計算日期之間的差異無關。 –

回答

5

最簡單的方法可能是編寫一個方法來獲得一週的開始。然後你可以從另一個日期中減去一個日期,將天數除以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 
+1

'GetEndOfWeek'是一個錯字,或者你省略了一個方法。 – Abion47

+0

@ Abion47:錯字 - 現在修復。 –

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

有點「簡化」,因爲需要只是開始日期的星期一:

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