2015-12-23 3 views
3

Я пытаюсь найти 5-й день недели в месяце, как 5-я неделя. Понедельник, 5-я неделя. , Ср ... и т. Д., Основанные на дате с того же месяца. Эта дата может принадлежать любой неделе того же месяца. Я попытался какКак найти 5-ю или конечную дату определенного дня в месяц по дате того же месяца

DateTime MonthEventDate=05/01/2016; //Date format in dd/MM/yyyy format 

DayOfWeek EventDay="Sunday"; //For Example i want to find 5th Sunday in January Month, but days too will change everytime based on user selection 

string SelectedWeek="5"; //Here i'm getting the week in which i need to find the given date i.e, 5th Monday or Tuesday & so on 
if (SelectedWeek == "5") 
{ 
    //Here i tried to add number of days to my initial day to find 5th day date, but every time its returning next month value 
    MonthEventDate = MonthEventDate.AddDays((EventDay < MonthEventDate.DayOfWeek ? 31 : 28) + EventDay - MonthEventDate.DayOfWeek); 
} 

Я знаю, что логика не так, но я хочу, чтобы получить дату 5-й день недели, и если в этот день нет, вернуть 0. Глядя на некоторые руководства Примечание: Здесь месяц будет меняться в зависимости от пользовательского ввода, так как вернуть Дату пятого дня, если она существует в данном месяце

+0

Вы ищете пятую неделю * или пятый * день недели? Я понятия не имею, что вы пытаетесь сделать. Можете привести несколько примеров? Если вы ищете пятую неделю, что делать, если нет пятой недели в течение месяца? – poke

+0

Ya ... Если 5-й недели нет, верните нулевую или дате возврата 5-го дня. Пример: В январе 2016 года у нас есть 5 воскресенья, поэтому, как найти 5-ю дату воскресенья на основе ввода, указанного в вопросе – Amar

+0

Я понедельника или в любой день, который повторяется 5-й раз в месяц – Amar

ответ

2

Это должно дать вам 5-й день (если есть) ...

DateTime dayInMonth = DateTime.Now; 
DayOfWeek dayToFind = DayOfWeek.Friday; 

var fifth= Enumerable.Range(1, DateTime.DaysInMonth(dayInMonth.Year, dayInMonth.Month)) 
      .Select(day => new DateTime(dayInMonth.Year, dayInMonth.Month, day)) 
      .Where(day => day.DayOfWeek == dayToFind) 
      .Skip(4) 
      .FirstOrDefault(); 
+0

Это еще не совсем ясно, но я думаю, что это это ответ, который хочет OP. –

0

Расширение ответа @Soner Gönül. На вкладке вы помещаете требуемый день недели, требуемый месяц и требуемый год. На выходе вы получите дату и тот же день недели в пятой недели, или null

public DateTime? FifthDay(DayOfWeek dayOfWeek, byte monthNum, int year) 
    { 
     if (monthNum > 12 || monthNum < 1) 
     { 
      throw new Exception("Month value should be between 1 and 12"); 
     } 

     var searchDate = new DateTime(year, monthNum, 1); 
     var weekDay = searchDate.DayOfWeek; 

     if (weekDay == dayOfWeek) 
     { 
      searchDate = searchDate.AddDays(28); 
     } 

     for (DateTime d = searchDate; d < d.AddDays(7); d = d.AddDays(1)) 
     { 
      if (d.DayOfWeek == dayOfWeek) 
      { 
       searchDate = searchDate.AddDays(28); 
       break; 
      } 
     } 

     if (searchDate.Month == monthNum) 
      return searchDate; 

     return null; 
    } 
0

Вы можете использовать простую математику как это (не валидация не включены)

static DateTime? FindDate(int year, int month, DayOfWeek dayOfWeek, int weekOfMonth = 5) 
{ 
    var baseDate = new DateTime(year, month, 1); 
    int firstDateOffset = ((int)dayOfWeek - (int)baseDate.DayOfWeek + 7) % 7; 
    var date = baseDate.AddDays(firstDateOffset + 7 * (weekOfMonth - 1)); 
    return date.Month == month ? date : (DateTime?)null; 
} 

Я думаю, что код является сам объяснительный , Единственный трюк, который, вероятно, нуждается в объяснении это линия

int firstDateOffset = ((int)dayOfWeek - (int)baseDate.DayOfWeek + 7) % 7; 

который обрабатывает случай, когда скажет месяц начинается в пятницу, и вы попросили в понедельник, и короткий эквивалент

int firstDateOffset = (int)dayOfWeek - (int)baseDate.DayOfWeek; 
if (firstDateOffset < 0) firstDateOffset += 7; 

Использования в ваш пример

var monthEventDate = FindDate(2016, 1, DayOfWeek.Sunday, 5); 
0

Вы можете передать этот демонстрационный код

int requiredDay = 5; //Day number i.e 0-6(Sunday to SaturDay) 
    DateTime day = new DateTime(2016, 1, 1); //Month,year,Date 
    if (DateTime.DaysInMonth(day.Year, day.Month) > 28) 
    { 
     //Get the first day name of the month 
     int firstMonthDay = (int)day.DayOfWeek; 

     int offset=0; 

     //Number of days from the first day for the required day 
     if (firstMonthDay <= requiredDay) 
      offset = requiredDay - firstMonthDay; 
    else 
     offset = 7 - firstMonthDay + requiredDay; 
// 
    DateTime firstoccurence = day.AddDays((double)offset); 
    DateTime fifthOccurence = firstoccurence.AddDays(28); 
    if (fifthOccurence.Month == firstoccurence.Month) 
      MessageBox.Show(fifthOccurence.ToString()); 
    else 
     MessageBox.Show("No 5th Occurence for this day"); 
    } 
Смежные вопросы