2016-09-30 16 views
2

2つの日付の間の週数を取得する必要があります。
私のための週は日曜から月曜日です。
したがって、最初の日付が今週よりも土曜日にある場合は含める必要があります。
2番目の日付が今週よりも月曜日の場合は含める必要があります。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

最も簡単な方法は、おそらく週の開始を取得する方法を記述することです。次に、別の日付から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 
+1

'GetEndOfWeek'はタイプミスか、メソッドを省略しました。 – Abion47

+0

@ Abion47:Typo - 修正されました。 –

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; 
} 
関連する問題