Получить дату-время для n-го воскресенья после сегодняшнего дня

#c# #.net #datetime #week-number

#c# #.net #дата-время #номер недели

Вопрос:

Я использую следующее, чтобы получить номер текущей недели:

 var weekNo = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.UtcNow,
                                                  CalendarWeekRule.FirstFullWeek,
                                                  DayOfWeek.Sunday);
  

И я хочу вернуть DateTime , представляющее первый день n-й недели после сегодняшнего.

например, когда n = 2, я бы хотел, чтобы DateTime представляло воскресенье после следующего.

Есть ли способ, которым я могу сделать это на C #?

Ответ №1:

Вы могли бы использовать:

 DateTime sundayInFuture = DateTime.Today.AddDays((n - 1) * 7   (7 - (int)DateTime.Today.DayOfWeek));
  

Это должно сработать (хотя у меня нет доступа ни к чему, чтобы это протестировать!).

Редактировать: Спасибо за комментарии.

Комментарии:

1. @anishMarokey — если вы оставляете подобный комментарий, по крайней мере, объясните, почему или какую ошибку вы получаете.

2. @anishMarokey: Почему бы и нет? Что я пропустил?

3. Мне пришлось использовать DateTime. Сегодня. День недели в int, но в остальном это работает. — Спасибо.

4. @Andy: Без проблем. Я обновлю свой ответ окончательным решением

Ответ №2:

Это должно сработать:

 int n = 2;
DateTime today = DateTime.Today;
int daysToNextSunday = (7 - today.DayOfWeek - DayOfWeek.Sunday) ;
DateTime nthSunday = today.AddDays((n - 1) * 7   daysToNextSunday);
  

Комментарии:

1. День недели. Воскресенье = 0, так что вы можете немного упростить ситуацию, проигнорировав это.

2. @Jackson: Да — Я не хотел делать это предположение, хотя мне легче анализировать, если оно есть там явно

3. Достаточно справедливо — это также упрощает преобразование в другой день недели.

4. Нет, это не облегчает преобразование. Этот код работает, потому что sunday == 0, с другим днем daysToNext может стать отрицательным, что фактически сделает его daysToPrevious…

Ответ №3:

Не могли бы вы добавить количество дней с этого момента до воскресенья, а затем добавить (n-1) * еще 7 дней?

Ответ №4:

Пожалуйста, обратите внимание, что Календарь.GetWeekOfYear не соответствует стандарту ISO 8601.

Вот пример использования класса Week из библиотеки временных периодов для .NET:

 // ----------------------------------------------------------------------
public DateTime GetStartOfWeek( DateTime moment, int offset )
{
  return new Week( new Week( moment ).WeekOfYear   Math.Abs( offset ) ).FirstDayOfWeek;
} // GetStartOfWeek