11

DateTimeオブジェクトTimeで指定された年の週番号を取得するための次のコードがあります

    public static int WeeksInYear(DateTime date)
    {
        GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized);
        return cal.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    }

関数に2012年1月1日の日付を指定すると、1週目が返されますが、52週目が返されます。理由がわかりません。誰もが理由を知っていますか?

4

6 に答える 6

9

アルゴリズムは、指示されたとおりに実行されます。CalanderWeekRuleがFirstFourDayWeekに設定されています。2012年1月1日は最初の4日間の週の一部ではなかったため、1月2日からカウントを開始するようにカレンダーに指示しました。

週番号から日付を計算する

于 2012-04-11T08:51:26.380 に答える
5
public static int WeeksInYear(DateTime date)
{
    GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized);
    return cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Monday);

CalendarWeekRule.FirstFourDayWeekCalendarWeekRule.FirstDayに変更すると、これでうまくいくと思います。

これを変更してから、正常に動作しました。

于 2013-01-03T03:48:36.137 に答える
1

週番号は正しく計算されました。週数が実際にどのように計算/カウントされるかについて読んでおく必要があります(ウィキペディア?!)。

注意:週数計算の組み込み計算にはバグがあります。Microsoftは、KnowledgeBase-Article200299で問題について説明しています。ISO-8601に問題があります。

于 2012-04-11T08:57:23.090 に答える
1

ISO8601の週番号のサポートをサポートする.NETの期間ライブラリののクラスを使用できます。

TimeCalendar calendar = new TimeCalendar(
    new TimeCalendarConfig { YearWeekType = YearWeekType.Iso8601 } );
Week week = new Week( new DateTime( 2012, 01, 01 ), calendar );
Console.WriteLine( "week #: ", week.WeekOfYear );
于 2012-04-11T10:01:05.990 に答える
0

2012年1月1日は日曜日でありGetWeekOfYear、日付を含む週を返すと言っているので、2012年の最初の週ではなく2011年の最後の週を返すと思います。

明確にするためにCalendarRuleを見てください。

于 2012-04-11T08:52:01.407 に答える
0

2012/1/1 日曜日でした。昨年の週の最後の日だったので、52 を取得したのはそのためだと思います。1 月 2 日には、正しい結果が得られるはずです。

于 2012-04-11T08:52:59.797 に答える