Выражение Quartz.net CRON всегда возвращает последний день месяца?

Я новичок в кварцевании.

Я просто пытаюсь выяснить, может ли Quartz.net, учитывая дату начала (возможно, в прошлом), дату окончания и интервал, вычислить правильное появление даты - это может быть не основной вариант использования Quartz, но это представляется возможным из что я могу узнать об API.

Итак, учитывая этот фрагмент:

var exp = new CronExpression("0 0 0 1/7 * ? *");

    var next = exp.GetNextValidTimeAfter(new DateTime(2012, 1, 1, 12, 30, 00).ToUniversalTime());
    while (next < DateTime.Parse("30 Oct 2012"))
    {
        next = exp.GetNextValidTimeAfter(next.Value);
        System.Diagnostics.Debug.WriteLine(next);
    }

Результаты кажутся (усеченными):

14/01/2012 11:00:00 a.m. +00:00

21/01/2012 11:00:00 a.m. +00:00

28/01/2012 11:00:00 a.m. +00:00

01.01.2012 11:00:00 +00:00

7/02/2012 11:00:00 a.m. +00:00

14/02/2012 11:00:00 a.m. +00:00

21/02/2012 11:00:00 a.m. +00:00

28/02/2012 11:00:00 a.m. +00:00

29 февраля 2012 г., 11:00:00 +00:00

7/03/2012 11:00:00 a.m. +00:00

Эээ... Кажется, выражение Quartz CRON всегда включает последний день месяца и, по сути, вычисляет следующую дату оттуда? Или мое ожидание/понимание кварца/крона неверно?

Также эти результаты, по-видимому, подкреплены с помощью http://www.cronmaker.com/...

Спасибо!


person 6footunder    schedule 29.08.2012    source источник


Ответы (1)


Я не думаю, что вы не можете достичь того, что ищете, с помощью выражения cron.

Если вы загружаете и используете Quartz.Net 2.x, вы можете использовать новый тип триггера под названием CalendarIntervalTrigger, который можно использовать для управления различными интервалами. .

Я протестировал этот фрагмент кода, и он работает так, как вы ожидаете:

DateTimeOffset startCalendar = DateBuilder.DateOf(11, 0, 0, 14, 1, 2012);

var weeklyTrigger = new CalendarIntervalTriggerImpl
{
    StartTimeUtc = startCalendar,
    RepeatIntervalUnit = IntervalUnit.Week,
    RepeatInterval = 1  // every one week;
};

IList<DateTimeOffset> fireTimes = TriggerUtils.ComputeFireTimes(weeklyTrigger, null, 10);

foreach (var item in fireTimes)
{
    Console.WriteLine(item);
}
Console.ReadLine();

Результат:

14/01/2012 11:00:00 +00:00
21/01/2012 11:00:00 +00:00
28/01/2012 11:00:00 +00:00
04/02/2012 11:00:00 +00:00
11/02/2012 11:00:00 +00:00
18/02/2012 11:00:00 +00:00
25/02/2012 11:00:00 +00:00
03/03/2012 11:00:00 +00:00
10/03/2012 11:00:00 +00:00
17/03/2012 11:00:00 +00:00

person LeftyX    schedule 29.08.2012
comment
Ценю усилия, предпринимаемые при попытке ответить на этот вопрос - не уверен, следует ли мне помечать его в настоящее время как ответ, поскольку фактический вопрос заключается не в том, как бы мы достигли правильного результата, а в том, работает ли CRON так, как мы наблюдали, или это была реализация Quartz? - person 6footunder; 30.08.2012
comment
Извините за LeftyX выше, но мой лучший ответ (совсем недавно обнаруженный), похоже, связан с общим поведением CRON - кажется, что каждая единица помещена в коробку из-за отсутствия лучшего термина для данной единицы, например. дней, в этом случае вы не можете перейти в следующую единицу (месяцы). Плохо, но, надеюсь, достаточно, чтобы объяснить, что мы видим с несколькими инструментами тестирования cron? - person 6footunder; 30.08.2012
comment
@6footunder: то, что вы пытаетесь сделать, невозможно с помощью одного выражения CRON (даже в Unix) superuser.com/questions/110911/ Единственное возможное решение — создать несколько выражений cron или использовать приведенное выше решение. - person LeftyX; 30.08.2012
comment
Справедливо - ссылка была полезной - person 6footunder; 01.09.2012