2013-06-25 3 views
0

Это довольно конкретный вопрос, мне нужны даты последних 6 пятниц в C# .NET. В настоящее время мы завершаем эту задачу, имея базу данных SQL с таблицей, полной дат пятницы в году.Последние 6 по пятницам с сегодняшнего дня

Это имеет две проблемы,

1) Это кажется ненужный запрос к базе данных, когда я уверен, что C# может это сделать.

2) Я должен помнить в конце года, чтобы добавить в следующем году.

Я осмотрел сеть, и я уверен, что это место где-то, что ясно показывает мне ответ, но я не могу найти его!

Я надеюсь, что кто-то может помочь мне с кодом для этого вопроса.

Большое спасибо заранее!

+1

Класс Календаря делает это очень хорошо: http://msdn.microsoft.com/en-us/library/system.globalization.calendar.aspx – C4stor

+6

Возможно, я просто неправильно вас понял, но вам нужно «ближайшие 6 пятниц» до «сегодня» или «ближайшие 6 пятниц», после Сегодня?" Кроме того, игнорируем ли мы сегодня, если сейчас пятница? –

+0

Это 6 пятницы до сегодняшнего дня, и если сегодня пятница, то это будет один из 6. – JammoD

ответ

3

DateTime struct имеет свойство под названием DayOfWeek. Это перечисление, в котором сообщается вам день недели, соответствующий этому экземпляру DateTime.

Таким образом, вы могли бы написать код вроде этого:

List<DateTime> sixFridays = new List<DateTime>(); 
DateTime foo = DateTime.Today; 

while (sixFridays.Count < 6) { 
    if (foo.DayOfWeek == DayOfWeek.Friday) sixFridays.Add(foo); 
    foo = foo.AddDays(-1); 
} 

Это будет получить вам шесть пятниц до сегодняшнего дня. Если вы хотите по шесть пятниц после сегодняшнего дня, добавьте только 1 день вместо -1 в цикле.

@Damien_The_Unbeliever предложил менее грубый принудительный подход. Вот он идет:

List<DateTime> sixFridays = new List<DateTime>(); 
DateTime foo = DateTime.Today; 

while (foo.DayOfWeek != DayOfWeek.Friday) { 
    foo = foo.AddDays(-1); 
} 

for (int i = 0; i < 6; foo.AddDays(-7)) { 
    sixFridays.Add(foo); 
    i++; // I don't remember if you could place this together with foo.AddDays(-7) in the last part of the command. 
} 

Отредактировано, так как OP сказал, что он хочет включить в текущий день в случае, если это пятница тоже, а также это шесть пятниц до сегодняшнего дня.

+0

Ударьте меня! Удалил мой и поддержал ваш. –

+2

Как вы думаете, после того, как вы определили первую пятницу, возможно, есть возможность, возможно, вычислить все остальные пятницы сразу же, а не зацикливаться? –

+0

@Damien_The_Unbeliever yep. Есть даже такой ответ, который я поддержал. Просто это 20-секундное решение. Всегда можно уточнить. Если бы это была более сложная проблема, я бы не использовал решение грубой силы, такое как предложение, которое я предлагаю. – Renan

5

Основная идея заключается в том, чтобы выбрать первую пятницу до сегодняшнего дня, и шаг за одну неделю, в то время:

var now = DateTime.Now; 
DateTime nearestFridayBeforeToday; 

if(now.DayOfWeek != DayOfWeek.Friday) 
{ 
    nearestFridayBeforeToday = now.AddDays(DayOfWeek.Friday - now.DayOfWeek) //returns first friday after today 
            .AddDays(-7); //so we need to subtract one week 
} 
else 
{ 
    nearestFridayBeforeToday = now; 
} 

var sixFridaysBeforeNow = Enumerable.Range(0, 6) 
            .Select(n => nearestFridayBeforeToday.AddDays(-7 * n)); 

//print results 
var r = sixFridaysBeforeNow.Select(d => string.Format("{0} : {1}", d, d.DayOfWeek)); 
Console.WriteLine (string.Join(Environment.NewLine, r)); 

принты:

6/21/2013 3:37:52 PM : Friday 
6/14/2013 3:37:52 PM : Friday 
6/7/2013 3:37:52 PM : Friday 
5/31/2013 3:37:52 PM : Friday 
5/24/2013 3:37:52 PM : Friday 
5/17/2013 3:37:52 PM : Friday 
+0

Это не будет иметь хороших результатов, если сегодня пятница или суббота. –

+0

@MattJohnson спасибо, исправлено –

+0

Почти, но не совсем там ... Проверьте логику, когда вы должны вычесть неделю. Сравните мой ответ, если вам нужен намек. :-) –

1

Вы можете попробовать это также

private List<DateTime> GetLastFridays() 
{ 

     List<DateTime> lstLastFridays = new List<DateTime>(); 
     TimeSpan oTimeSpan = new TimeSpan(((int)DateTime.Now.DayOfWeek + 2), 0, 0, 0, 0); 
     DateTime dt = DateTime.Now.Subtract(oTimeSpan); 

     lstLastFridays.Add(dt); 

     for (int count = 0; count < 6; count++) 
     { 
      dt = dt.Subtract(new TimeSpan(7, 0, 0, 0, 0)); 
      lstLastFridays.Add(dt); 
     } 

     return lstLastFridays; 

} 
+2

игнорируя другие подробности, я хочу предложить использовать 'TimeSpan.FromDays (7)' вместо 'new TimeSpan (7, 0, 0, 0, 0)' - он делает код более читаемым. –

+0

Вы также можете использовать 'DateTime.AddDays'. Я думаю, что это более интуитивно. – Renan

2

Вот способ расширения, который вы можете использовать.

public static IEnumerable<DateTime> Last(this DayOfWeek dow, int count) 
{ 
    var today = DateTime.Today; 
    var adjustment = today.DayOfWeek - dow + (dow > today.DayOfWeek ? 7 : 0); 
    return Enumerable.Range(0, count) 
        .Select(x => today.AddDays(x * -7 - adjustment)); 
} 

Зова это следующий образом:

var last6Fridays = DayOfWeek.Friday.Last(6); 

Например:

var last6Fridays = DayOfWeek.Friday.Last(6); 
var formatted = string.Join(Environment.NewLine, 
          last6Fridays.Select(x => x.ToLongDateString())); 
Console.WriteLine(formatted); 

Выход:

Пятница, 21 Июня 2013
пятница, 14 Июня 2013
Пятница, 7 Июня 2013
Пятницы, 31 Май 2013
Пятницы, 24 Май 2013
пятницы, 17 май 2013

+0

+1, хороший ответ –