2015-02-19 4 views
0

Я пытаюсь создать коллекцию DateTime объектов, которые представляют все субботы с текущей даты до 4 недель вперед и 13 недель назад. Я пытаюсь заказать эту коллекцию тем, что является самым последним в отношении текущего дня и времени в верхней части коллекции.Получите субботу DateTime 4 недели вперед и 13 недель назад

TIA!

+0

Так каков твой вопрос? Где у вас есть трудности? Вы посмотрели документацию MSDN для 'DateTime' и всех функций и свойств там? –

+0

Кроме того, укажите * последнее *, поскольку вы проецируете 4 недели в будущее. –

+0

отредактирован в отношении вышеуказанного – user3010406

ответ

1

Попробуйте использовать следующий код.

Он перебирает через недели вам нужно от -13 до +4 недель от текущей даты и регулирует определенный день к одному вам нужно (в данном случае Saturday)

for (int i = -13; i <= 4; i++) 
{ 
    var dateBackWithIWeeks = DateTime.Now.AddDays(i * 7); 
    switch (dateBackWithIWeeks.DayOfWeek) 
    { 
     case DayOfWeek.Sunday: 
      dateBackWithIWeeks = dateBackWithIWeeks.AddDays(-1); 
      break; 
     case DayOfWeek.Monday: 
      dateBackWithIWeeks = dateBackWithIWeeks.AddDays(5); 
      break; 
     case DayOfWeek.Tuesday: 
      dateBackWithIWeeks = dateBackWithIWeeks.AddDays(4); 
      break; 
     case DayOfWeek.Wednesday: 
      dateBackWithIWeeks = dateBackWithIWeeks.AddDays(3); 
      break; 
     case DayOfWeek.Thursday: 
      dateBackWithIWeeks = dateBackWithIWeeks.AddDays(2); 
      break; 
     case DayOfWeek.Friday: 
      dateBackWithIWeeks = dateBackWithIWeeks.AddDays(1); 
      break; 
     case DayOfWeek.Saturday: 
      break; 
    } 

    Console.WriteLine(dateBackWithIWeeks.Date); 
} 
1

ОБНОВЛЕНО НА ОСНОВЕ КОММЕНТАРИЕВ

Примечание: код, возможно, необходимо скорректировать в зависимости от того, как вы определяете «13 недель назад» (и «4 недели с этого момента»). Рассматриваете ли вы календарные недели или буквально 13 * 7 дней? Приведенный ниже код выглядит 13 * 7 дней.

Вот один из способов сделать это:

  1. Создать дату начала сегодня минус 13 недель
  2. Установите дату начала и до следующей субботы (если это не суббота)
  3. Создать конец дата сегодня плюс 4 недели
  4. за каждые 7 дней от начала до конца, добавить день к списку
  5. Заказать список по дате, по убыванию

Вот пример реализации:

var saturdays = new List<DateTime>(); 
var daysInWeek = 7; 

var startDate = DateTime.Today.Subtract(TimeSpan.FromDays(13 * daysInWeek)); 

// Adjust start date so it is the first Saturday after 13 weeks before today 
startDate = startDate.AddDays(DayOfWeek.Saturday - startDate.DayOfWeek); 

var endDate = DateTime.Today.Add(TimeSpan.FromDays(4 * daysInWeek)); 

for (var curDate = startDate; curDate <= endDate; curDate = curDate.AddDays(daysInWeek)) 
{ 
    saturdays.Add(curDate); 
} 

// Order by date, descending 
saturdays = saturdays.OrderByDescending(d => d).ToList(); 

// Output list of Saturdays to console for verification 
saturdays.ForEach(s => Console.WriteLine(s.ToShortDateString())); 
+0

Несомненно, как только вы нашли субботу, вы должны хотя бы начать пропустить 7 дней вместо 1? –

+0

@MattBurland Хорошая точка, отрегулирует –

+0

@MattBurland Обновленный код, так что дата начала - суббота, а затем петли каждые 7 дней. –

1

Как об этом:

public static void Main() 
{ 
    var start = DateTime.Now; 
    var saturdays = GetSaturdays(start, 13, 4).OrderBy(d => Math.Abs((start - d).Days)); 
    foreach (var s in saturdays) 
    { 
     Console.WriteLine(s.ToLongDateString()); 
    } 
} 

public static IEnumerable<DateTime> GetSaturdays(DateTime start, int weeksBack, int weeksForward) 
{ 
    var startingSat = start.AddDays(6 - (int)start.DayOfWeek); 
    for (int i = -weeksBack; i < weeksForward; i++) 
    { 
     yield return startingSat.AddDays(i * 7); 
    } 
} 

Ваш вопрос все еще немного неясно, как вы хотите их заказать, но вы можете изменить порядок, чтобы отразить бы то ни было вы хотите. Похоже, вы хотите, чтобы они заказали, насколько они близки к дате начала, что почти наверняка не имеет смысла. Если вы просто хотите, чтобы они отсортированы по дате по убыванию (это то, что вы должны были сказать, если это то, что вы на самом деле хотите) Тогда просто заменить OrderBy с:

.OrderByDescending(d => d); 

Вот fiddle

1
List<DateTime> saturdays = new List<DateTime>(); 
for (int i = -13; i < 4; i++) 
    saturdays.Add(DateTime.Now.AddDays(i * 7 - (DateTime.Now.DayOfWeek - DayOfWeek.Saturday))); 
DateTime today = DateTime.Now; 
var more_recent = saturdays.OrderBy(day => Math.Abs(today.Subtract(day).Days)).ToList();