#c# #datetime
Вопрос:
Я создаю веб-приложение, которое может отображать даты в календаре на основе «Шаблона», который может выбрать пользователь. Это элементы управления выбором шаблона из веб-интерфейса
Теперь, как только он выберет шаблон, он может нажать кнопку «Сгенерировать даты», и на сервер будет отправлен вызов API для расчета дат на основе выбора шаблона.
- Я смог сгенерировать даты, когда пользователь выбирает Pattern Mode= «ДЕНЬ» и «НЕДЕЛЯ» с помощью приведенного ниже кода.
- Я не смог справиться с тем, когда он выбирает «МЕСЯЦ» или » ГОД » в качестве режима PetternMode
- Когда он выбирает «Месяц» в качестве режима шаблона и «День месяца» в качестве ограничения => я смог сгенерировать даты, если значение шаблона=1. Когда он меняет значение шаблона на 2 или что-то в этом роде, оно ломается.
- Как обращаться с такими шаблонами, как «Каждые 2 месяца», «Каждую вторую субботу» и т. Д..
- Существует ли какая-либо библиотека или способ повысить эффективность этого кода? (Наименьший приоритет)
Это то, что я пытался
public static List<DateTime> GenerateUpcomingDates(this Repeat repeat, DateTime from, DateTime till)
{
List<DateTime> result = new List<DateTime>();
//DAY MODE
if(repeat.PatternMode == PATTERNMODE.Day)
{
while(from <= till)
{
result.Add(from);
from = from.AddDays(repeat.PatternValue);
}
return resu<
}
//WEEK MODE
else if (repeat.PatternMode == PATTERNMODE.Week)
{
while (from <= till)
{
if(repeat.Sunday amp;amp; from.DayOfWeek == DayOfWeek.Sunday)
{
result.Add(from);
}
if (repeat.Monday amp;amp; from.DayOfWeek == DayOfWeek.Monday)
{
result.Add(from);
}
if (repeat.Tuesday amp;amp; from.DayOfWeek == DayOfWeek.Tuesday)
{
result.Add(from);
}
if (repeat.Wednesday amp;amp; from.DayOfWeek == DayOfWeek.Wednesday)
{
result.Add(from);
}
if (repeat.Thursday amp;amp; from.DayOfWeek == DayOfWeek.Thursday)
{
result.Add(from);
}
if (repeat.Friday amp;amp; from.DayOfWeek == DayOfWeek.Friday)
{
result.Add(from);
}
if (repeat.Saturday amp;amp; from.DayOfWeek == DayOfWeek.Saturday)
{
result.Add(from);
}
from = from.AddDays(repeat.PatternValue);
}
return resu<
}
//MONTH MODE
if (repeat.PatternMode == PATTERNMODE.Month)
{
if (repeat.Constrain == CONSTRAIN.DayOfMonth)
{
//This works only when patternValue=1
while (from <= till)
{
if(from == new DateTime(from.Year, from.Month, repeat.DayOfMonth))
{
result.Add(from);
}
from = from.AddDays(1);
}
return resu<
}
else if (repeat.Constrain == CONSTRAIN.Logical)
{
//Not working...
}
}
return new List<DateTime>();
}
//YEAR MODE
// Not implemented...
}
This is how I call the above extension method (to generate a list of dates for the next 1 year starting from one date)
var UpcomingDates = repeat.GenerateUpcomingDates(repeat.StartBy, repeat.StartBy.AddYears(1))
This is the result so far I can achieve
Это класс ПЕРЕЧИСЛЕНИЯ и повторения
public class Repeat
{
public int Id { get; set; }
public int ActivityId { get; set; }
public COURSE Course { get; set; }
public int PatternValue { get; set; }
public PATTERNMODE PatternMode { get; set; }
public bool Sunday { get; set; }
public bool Monday { get; set; }
public bool Tuesday { get; set; }
public bool Wednesday { get; set; }
public bool Thursday { get; set; }
public bool Friday { get; set; }
public bool Saturday { get; set; }
public CONSTRAIN Constrain { get; set; }
public int DayOfMonth { get; set; }
public LOGICALSTART LogicalStart { get; set; }
public DAY LogicalDay { get; set; }
public DateTime StartBy { get; set; }
public TIMEMODE TimeMode { get; set; }
public DateTime SpecificTime { get; set; }
public DateTime UpdatedOn { get; set; }
}
public enum COURSE
{
OneTime=1,
SeveralTimes=2
}
public enum PATTERNMODE
{
Day=1,
Week=2,
Month=3,
Year=4
}
public enum CONSTRAIN
{
DayOfMonth=1,
Logical=2,
}
public enum LOGICALSTART
{
First=1,
Second=2,
Third=3,
Fourth=4,
Last=0
}
public enum DAY
{
Sunday=1,
Monday=2,
Tuesday=3,
Wednesday=4,
Thursday=5,
Friday=6,
Saturday=7,
}
public enum TIMEMODE
{
Adaptive=1,
Specific=2
}
Комментарии:
1. Пожалуйста, укажите код для
Repeat
,PATTERNMODE
,TIMEMODE
, иCONSTRAIN
.2. PATTERNMODE и CONSTRAIN-это перечисления, я добавил их на скриншоте выше в скобках
3. Время, необходимое для написания «РЕЖИМ ШАБЛОНА и ОГРАНИЧЕНИЕ-это перечисления, я добавил их на скриншоте выше в скобках», вероятно, больше, чем время, необходимое для копирования и вставки вашего кода.
4. Спасибо. Мы будем очень признательны, если мы сможем запустить ваш код.
5. raboof.com/projects/ncrontab также выглядит действительно полезным преобразовать синтаксис cron в нужные вам случаи в .net