9

C# で関数を作成して、その週の週番号を返す関数を作成したいと考えています。

たとえば、週番号 40 の場合、4/10、5/10、6/10、7/10、8/10、9/10、10/10 の日付を取得するにはどうすればよいですか。

前もって感謝します!

4

3 に答える 3

10

これはあなたが望むことをするべきだと思います:

    public static DateTime[] WeekDays(int Year, int WeekNumber)
    {
        DateTime start = new DateTime(Year, 1, 1).AddDays(7 * WeekNumber);
        start = start.AddDays(-((int)start.DayOfWeek));
        return Enumerable.Range(0, 7).Select(num => start.AddDays(num)).ToArray();
    }

私は日曜日を週の最初の曜日として扱っていますが、月曜日を最初の曜日にしたい場合は、範囲を (0,7) から (1,7) に変更してください。

ISO規格に準拠したい場合は、これでうまくいくはずです:

    public static DateTime[] WeekDays(int Year, int WeekNumber)
    {
        DateTime start = new DateTime(Year, 1, 4);
        start = start.AddDays(-((int)start.DayOfWeek));
        start = start.AddDays(7 * (WeekNumber - 1));
        return Enumerable.Range(0, 7).Select(num => start.AddDays(num)).ToArray();
    }
于 2010-10-04T10:49:54.173 に答える
1

ノート

バグを見逃したようです。現在のコードは、この事実を説明するために2012-01-30の時点で更新されておりdaysOffset、火曜日に基づいて導出されています。これは、 MikaelSvensonによると問題を解決しているようです。詳細については、この回答を参照してください。

ほとんどの人はこれを間違える傾向があり、間違ってISO8601週の日付(スウェーデンではこれをよく使用します)標準に準拠していないことを意味します。この計算はちょっと奇妙ですが、.NETのこのコードに要約されます。

DateTime jan1 = new DateTime(yyyy, 1, 1);

int daysOffset = DayOfWeek.Tuesday - jan1.DayOfWeek;

DateTime firstMonday = jan1.AddDays(daysOffset);

var cal = CultureInfo.CurrentCulture.Calendar;

int firstWeek = cal.GetWeekOfYear(jan1, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

var weekNum = ww;

if (firstWeek <= 1)
{
    weekNum -= 1;
}

var result = firstMonday.AddDays(weekNum * 7 + d - 1);

return result;

日付(yyyy)、週番号(ww)、および曜日(d)を計算します。これは、組み込みのカレンダーを使用して1月1日を最初に確立することによって行われます(したがって、このコードはカスタマイズできます)。これが少し奇妙な理由は、53週目が1月に発生することもあれば、1週目が12月に発生することもあるためです。

逆に行く必要がある場合、それは完全に些細なことではありませんが、.NETでこれを行う正しい方法がここに示されています。

var c = CultureInfo.CurrentCulture.Calendar;

// `FromDayOfWeek` fixes problem with the enumeration
// not based on Monday being the first day of the week
d = (byte)FromDayOfWeek(c.GetDayOfWeek(t));
switch (d)
{
    case 1:
    case 2:
    case 3:
        // see this for details
        // http://blogs.msdn.com/shawnste/archive/2006/01/24/iso-8601-week-of-year-format-in-microsoft-net.aspx
        t = t.AddDays(3);
        break;
}

ww = (byte)c.GetWeekOfYear(t, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

// Adjust year when week 53 occurs in January or week 1 occurs in December 
if (ww == 53 && t.Month == 1)
{
    yyyy = (short)(t.Year - 1);
}
else if (ww == 1 && t.Month == 12)
{
    yyyy = (short)(t.Year + 1);
}
else
{
    yyyy = (short)t.Year;
}
于 2011-03-21T13:21:39.257 に答える
1

次の関数は、週番号と年から開始日を取得するのに役立ちます

public DateTime GetFirstDayFromWeekNumber(int weekNumber, int weekYear)
        {
            DateTime beginingYear = new DateTime(weekYear, 1, 1);
            DateTime finalDate = new DateTime();
            int maxDayOfWeek = (int)DayOfWeek.Saturday;
            int yearStartDay = (int)beginingYear.DayOfWeek;
            int dayDeference = maxDayOfWeek - yearStartDay;

            if (weekNumber == 1)
            {
                finalDate = beginingYear.AddDays(-yearStartDay);
            }
            else if (weekNumber == 2)
            {
                finalDate = beginingYear.AddDays((dayDeference + 1));
            }
            else if (weekNumber > 2 && weekNumber <= 53)
            {
                finalDate = beginingYear.AddDays((dayDeference + 1) + ((weekNumber - 2)* 7));
            }
            return finalDate;
        }
于 2012-03-05T12:22:03.660 に答える