2012-04-17 2 views
-1

Мне интересно, могу ли я получить дату каждой альтернативной пятницы, начиная с 13 апреля 2012 года, чтобы указать ее как параметр хранимой процедуры с использованием C#, asp.net?Получить дату каждой альтернативной пятницы

Должно быть также последнее время прошедшее. Спасибо!

+4

Это был бы очень длинный параметр sproc .. –

+0

Ну, вы хотите это с 4/13/12 или с последней пятницы? И на какую дату вы хотите, чтобы это закончилось ..? –

+1

date.AddDays (14) – scottheckel

ответ

7

Просто установите DateTime с датой вы хотите начать с, а затем продолжайте добавлять 14 дней:

Так, чтобы получить каждую вторую пятницу после того, как 4/13 до конца года:

DateTime dt = new DateTime(2012, 04, 13); 
while (dt.Year == 2012) 
{ 
    Console.WriteLine(dt.ToString()); 
    dt = dt.AddDays(14); 
} 

Дополнительная информация после комментария:

Если вы хотите использовать последнюю альтернативную пятницу с 2012/04/13, вы можете вычислить количество дней между настоящим и 2012/04/13, взять оставшуюся часть, разделенную на 14 , и вычтите, что много дней с сегодняшней даты:

DateTime baseDate = new DateTime(2012, 04, 13); 
DateTime today = DateTime.Today; 

int days = (int)(today - baseDate).TotalDays; 
int rem = days % 14; 
DateTime mostRecentAlternateFriday = today.AddDays(-rem); 
+0

Ваш ответ потрясающий! Спасибо! – Ram

2

Вы можете легко сделать метод генератора, который даст вам множество пятниц:

public IEnumerable<DateTime> GetAlternatingFridaysStartingFrom(DateTime startDate) 
{ 
    DateTime tempDate = new DateTime(startDate.year, startDate.Month, startDate.Day); 

    if(tempDate.DayOfWeek != DayOfWeek.Friday) 
    { 
     // Math may be off, do some testing 
     tempDate = tempDate.AddDays((7 - ((int)DayOfWeek.Friday - (int)tempDate.DayOfWeek) % 7); 
    } 

    while(true) 
    {     
     yield return tempDate; 
     tempDate = tempDate.AddDays(14); 
    } 
} 

Затем просто использовать некоторые LINQ, чтобы определить, сколько вы хотите:

var numberOfFridays = GetAlternatingFridaysStartingFrom(DateTime.Today).Take(10); 
+0

DateTime - это структура, поэтому значения скопированы. Нет необходимости в дате temp, вы можете просто использовать параметр; вы хотите, чтобы он был в новой переменной только для другого имени, просто назначьте startDate для TempDate, и он выполнит глубокую копию. Кроме того, более читаемый способ добраться до следующей пятницы: 'while (tempDate не в пятницу) tempDate.AddDays (1) 'Это не работает совсем хорошо, но это все еще постоянное время, поэтому кто заботится. – Servy

+0

Потенциально, но кто-то мог передать дату с минутной и секундной информацией, и я не хотел копировать это вперед. Таким образом, вы получаете только XX/YY/ZZ 00: 00.000 datetime. – Tejs

+0

Для этого можно использовать свойство 'Date'. 'tempDate = startDate.Date' Затем он делает цель более четкой в ​​коде. – Servy

0

Зачем вам хранить хранимую процедуру?

Если у вас есть дата в пятницу, почему бы просто не использовать AddDays(14) в петле?

Если вы хотите, чтобы найти ближайшую пятницу с датой начала, просто используйте:

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

Затем используйте цикл 14 дня, чтобы получить каждую вторую пятницу.

0

Вы можете создать простой метод, который будет перечислять их, как так:

public static IEnumerable<DateTime> GetAlternatingWeekDay(DateTime startingDate) 
{ 
    for (int i = 1; ; i++) 
    { 
     yield return startingDate.AddDays(14*i); 
    } 
} 

Что вы можете назвать так:

DateTime startingDate = DateTime.Parse("2012-04-13"); 
foreach (var date in GetAlternatingWeekDay(startingDate).Take(10)) 
{ 
    Console.WriteLine(date.ToString("R")); 
} 

С другой стороны, если вам нужно знать дату для заданного числа из недель вы можете использовать такой код:

DateTime date = DateTime.Parse("2012-04-13").AddDays(7 * numberOfWeeks);