Лучший способ выяснить следующий еженедельный график по конкретному названию дня - PullRequest
1 голос
/ 11 апреля 2011

представьте, что у меня есть свойство с именем NextSend, представляющее DateTime значение

4/11/2011 10:30:00 AM - Monday

. Допустим, у меня есть расписание, которое нужно отправлять каждую неделю на определенный день (Monday) в этом случае, поэтому, чтобы выяснить следующий недельный график, я нашел решение, в котором я должен проверять каждый следующий день до совпадения DayOfWeek с specific day в графике.

4/ 17 / 2011 10:30:00 AM - Monday

Есть ли какой-либо другой лучший способ преодолеть проверку названия дня на каждый следующий день?

здесьмоя упомянутая логика:

  int nowYear = DateTime.Now.Year;
  int nowMonth = DateTime.Now.Month;
  int nowDay = DateTime.Now.Day;
  int scheduleHour = this.Schedule.Time.Value.Hour;
  int scheduleMinute = this.Schedule.Time.Value.Minute;
  int scheduleSecond = this.Schedule.Time.Value.Second;
  int scheduleDay = -1;
  if(this.Schedule.Day.HasValue)
      scheduleDay= this.Schedule.Day.Value;

 switch (type)
            {
                case Schedule.ScheduleType.Weekly:
                    bool founded = false;
                    while (!founded)
                    {
                        //Check if last day of the current month
                        if (DateTime.DaysInMonth(nowYear, nowMonth) == nowDay)
                        {
                            //last day at this year, then move to next year
                            if (nowMonth == 12)
                            {
                                nowYear++;
                                nowMonth = 1;
                                nowDay = 1;
                            }
                            //its the end of a month then Move to next month
                            else
                            {
                                nowMonth++;
                                nowDay = 1;
                            }
                        }
                        //Get new proposed date
                        newNextSend = new DateTime(nowYear, nowMonth, nowDay, scheduleHour, scheduleMinute, scheduleSecond);

                        //Check if Next week schedule founded with specific day name
                        if (newNextSend.DayOfWeek ==
                            (DayOfWeek)Enum.Parse(typeof(DayOfWeek), Schedule.daysCalendar[scheduleDay - 1]))
                        {
                            founded = true;
                        }
                        else
                            nowDay++;
                    }
                    break;
}

Ответы [ 4 ]

3 голосов
/ 11 апреля 2011

Как и все остальные люди сказали: AddDays (7) обеспечит выполнение еженедельного расписания в соответствии с требованиями. Но если вы ищете способ выяснить следующее вхождение определенного дня недели , то вы можете сделать что-то вроде этого:

private static DateTime GetNextDayOccurrence(DayOfWeek day, DateTime startDate)
{
    if (startDate.DayOfWeek == day)
    {
        return startDate;
    }
    else
    {
        return GetNextDayOccurrence(day, startDate.AddDays(1));
    }
}

Тогда такой звонок

var nextWednesday = GetNextDayOccurrence(DayOfWeek.Wednesday, DateTime.Today);

вернет первое вхождение среды. После чего еженедельное расписание продолжается. Если вам нужно первое появление «Среда» со следующей недели, просто введите

DateTime.Today.AddDays(7) 

к параметру "startDate" вышеуказанного метода.

2 голосов
/ 11 апреля 2011

Почему бы просто не добавить 7 дней к исходной дате?Количество дней в неделе постоянно;)

Следующий понедельник:

var nextMonday = thisMonday.AddDays(7);
0 голосов
/ 11 апреля 2011
  1. Существует вызов метода AddDays, который автоматически обрабатывает переносы месяца и года.
  2. Недели всегда 7 дней. Просто добавьте разницу между текущим днем ​​недели и днем ​​недели в расписании.
0 голосов
/ 11 апреля 2011

Не можете ли вы использовать AddDays (7)?

например,

DateTime nextSheduleDate = scheduleDateTime.AddDays(7); 

Вот нерекурсивная версия ответа Тобиаса.Используя логику, упомянутую Даниэлем.

public static DateTime GetNextDayOccurrence(DateTime startDate, DayOfWeek dayOfWeek)
{
  var offset = startDate.DayOfWeek > dayOfWeek ? 7 : 0;
  var days = (int) dayOfWeek + offset - (int) startDate.DayOfWeek;

  var dateTime = startDate.AddDays(days);
  return dateTime;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...