Получить диапазон дат по номеру недели c #

Возможный дубликат:
В .net, зная номер недели, как я могу узнать дату дня недели?

Привет,

У меня к вам вопрос. Как мне получить диапазон дат для данного номера недели.

Например: если я ввожу неделю 12, результат должен быть:

21-03-2011
22-03-2011
23-03-2011
24-03-2011
25-03-2011
26-03-2011
27-03-2011

Я очень надеюсь, что вы, ребята, можете мне помочь, я просто нигде не могу найти тент!

Заранее спасибо.


person Wesley    schedule 21.03.2011    source источник
comment
Сильный дубликат stackoverflow.com/questions/3854429/   -  person Saurabh Gokhale    schedule 21.03.2011


Ответы (3)


Примечание

Кажется, я пропустил ошибку. Текущий код был обновлен по состоянию на 30 января 2012 года, чтобы учесть этот факт, и теперь мы выводим daysOffset на основе вторника, который согласно Микаэль Свенсон, похоже, решил проблему.

Эти расчеты даты недели ISO8601 немного неудобны, но вот как вы это делаете:

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;

По сути, вычислите контрольную точку, а затем добавьте дни, сложность связана с тем фактом, что 53-я неделя иногда может приходиться на январь, а неделя 1 - на декабрь. Вам нужно приспособиться к этому, и это один из способов сделать это.

Приведенный выше код вычисляет дату окончания года (гггг), номер недели (ww) и день недели (d).

person John Leidegren    schedule 21.03.2011
comment
Если я введу yyyy = 2012, ww = 1 и d = Monday (1), ваш код вернет 9 января, а не 2 января, что было бы правильно. - person Mikael Svenson; 30.01.2012
comment
См. Мой ответ здесь: stackoverflow.com/a/9064954/153390 - person Mikael Svenson; 30.01.2012
comment
К сожалению, я помню, как переделывал этот код и создавал много тестов, но он старше и, очевидно, не так, но ваше небольшое изменение, похоже, работает, и у меня нет возможности проверить это более тщательно, поэтому я собираюсь поверьте, что вы это сделали сами и поправьте мой ответ;) - person John Leidegren; 30.01.2012
comment
Тестировал каждый день с 1900-1-1 по 3000-12-31 :) - person Mikael Svenson; 31.01.2012

  • Узнайте, какой день недели был первым января года (например, в 2011 году это была суббота)
  • Добавьте необходимое количество дней, чтобы стать следующим понедельником (2 дня)
  • С этого дня добавьте (Количество недель - 1) * 7 дней, чтобы получить первый день недели, который вас интересует -Показать этот день плюс следующие дни, чтобы получить всю неделю
person Tomas Walek    schedule 21.03.2011

Что-то вроде этого должно помочь

        DateTime d = new DateTime(someYear, 1, 1);
        d.AddDays(numWeeks * 7);
        for (int x = 0; x < 7; x++)
        {
            Console.WriteLine(d.ToShortDateString());
            d.AddDays(1);
        }
person Erix    schedule 21.03.2011
comment
Не буду голосовать против, но решение Джона, приведенное ниже, является правильным. Все это изложено в материалах ISO ... - person Martin Milan; 21.03.2011
comment
Да, это слишком упрощенно и иногда вычисляется неверная дата. - person John Leidegren; 21.03.2011