1. ホーム
  2. c#

[解決済み】指定された日付の正しい週番号を取得する

2022-04-02 20:45:56

質問内容

いろいろとググってみたのですが、どれも2012-12-31の正しい週番号を教えてくれません。MSDNにある例でも ( リンク ) が失敗します。

2012-12-31は月曜日なので、第1週目のはずですが、どの方法を試しても53と表示されます。以下は、私が試した方法の一部です。

MDSNライブラリから。

DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar;

return cal.GetWeekOfYear(date, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);

解決策2

return new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

解決策3.

CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;

更新情報

以下のメソッドは、実際には日付が2012-12-31のときに1を返します。つまり、私の問題は、私のメソッドがISO-8601の規格に従っていないことだったのです。

// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
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);
}

解決方法は?

このように MSDNページ ISO8601の週番号と.Netの週番号には若干の違いがあります。

MSDN Blogのこちらの記事でより詳しく解説しています: " Microsoft .Net における ISO 8601 年版週番号形式 "

簡単に言うと、.Netでは年をまたいで週を分割することができますが、ISO規格ではできません。 この記事には、年の最終週に対して正しいISO 8601の週番号を取得する簡単な関数もあります。

更新情報 以下のメソッドは、実際には 2012-12-31 これは、ISO 8601 (例:ドイツ) では正しいです。

// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
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);
}