1

1年の週数を計算したいと思います。この投稿を見ました

この投稿では、受け入れられた回答で次のコードを使用します。

public static int GetIso8601WeekOfYear(DateTime time)
{
    // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll 
    // be the same week# as whatever Thursday, Friday or Saturday are,
    // and we always get those right
    DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    // Return the week of our adjusted day
    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

しかし、問題があります。月の最終日が日曜日の場合、週番号が繰り返されます。

たとえば、2013 年 3 月の最終日は日曜日です。今週は13日、正解です。しかし、4 月では、C# が 1 か月に常に 6 週間を使用して週数を計算する方法は、4 月の最初の週に 4 月の日がありません。したがって、C# では 4 月の最初の週は 15 週目ですが、これは正しくなく、14 週目である必要があります。

それで、正しい方法で週数を計算する方法があるかどうか知りたいです。

編集:

私はこれを意味します:

3 月の最終週は次のとおりです。

25 26 27 28 29 30 31

これは13番目です、正しいです。

4 月の最初の週は次のとおりです。

1 2 3 4 5 6 7

そして今週は15日として計算されます。

したがって、3 月のカレンダーを見ると最後の週は 13 日と計算され、4 月のカレンダーを見ると 3 月の最後の週は 14 日と計算されます。これは正しくありません。

解決:

DateTime dtCalendar = Calendar.DisplayDate;
int gridRow = (int)GetValue(Grid.RowProperty);

// Return the week of our adjusted day
int wueekNumber= System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(dtCalendar, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);

if (dtCalendar.DayOfWeek == DayOfWeek.Monday)
{
    gridRow = gridRow - 1;
}

Text = (weekNumbe r+ gridRow - 1).ToString();  

ありがとう。

4

1 に答える 1

1

問題は、間違った を使用していることCalendarWeekRuleです。必要な結果を得るには、 を使用する必要がありますFirstDay。インターネットで使用する必要があると言っているさまざまなコードを見てきましFirstFourDayWeekたが、いくつかのテストの後、「正しいもの」はFirstDay. あなたの例でテストしたところ、正しい結果が得られました: 14 週目です。

int targetYear = 2013;
DateTime targetDate = new DateTime(targetYear, 4, 1);
int week = System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(targetDate, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);
于 2013-07-17T18:38:27.767 に答える