DateTimeOffset? next = expression.GetNextOccurrence(DateTimeOffset.UtcNow, easternTimeZone);
If you passed a DateTime
объект, результирующее время будет в UTC. Если вы использовали DateTimeOffset
, результирующий объект будет содержать правильное смещение, поэтому не забудьте использовать его особенно во время переходов на летнее и зимнее время (см. ниже).
Если вы просто хотите выполнить все вычисления, используя местное время, вам придётся использовать класс DateTimeOffset
, потому что, как я уже говорил ранее, объекты DateTime
могут быть неоднозначными во время перехода на летнее время. Вы можете получить результирующее местное время, используя свойство DateTimeOffset.DateTime
.
CronExpression expression = CronExpression.Parse("* * * * *");
DateTimeOffset? next = expression.GetNextOccurrence(DateTimeOffset.Now, TimeZoneInfo.Local);
var nextLocalTime = next?.DateTime;
Если вы хотите указать секунды, используйте другую перегрузку метода Parse
и укажите аргумент CronFormat
следующим образом:
CronExpression expression = CronExpression.Parse("*/30 * * * * *", CronFormat.IncludeSeconds);
DateTime? next = expression.GetNextOccurrence(DateTime.UtcNow));
Вы также можете получать вхождения в фиксированном диапазоне дат/времени, используя метод GetOccurrences
. По умолчанию аргумент from
будет включён при совпадении, а аргумент to
будет исключён. Однако вы можете настроить это поведение.
CronExpression expression = CronExpression.Parse("* * * * *");
DateTime? occurrence = expression.GetOccurrences(
DateTime.UtcNow,
DateTime.UtcNow.AddYears(1),
fromInclusive: true,
toInclusive: false);
Существуют различные перегрузки для этого метода для поддержки аргументов DateTimeOffset
или часовых поясов.
Выражение Cron — это маска для определения фиксированных времён, дат и интервалов. Маска состоит из полей секунды (необязательно), минуты, часа, дня месяца, месяца и дня недели. Все поля позволяют вам указать несколько значений, и любая заданная дата/время будет соответствовать указанному выражению Cron, если все поля содержат соответствующее значение.
Допустимые значения Допустимые специальные символы Комментарий
┌───────────── секунда (необязательно) 0-59 * , - /
│ ┌───────────── минута 0-59 * , - /
│ │ ┌───────────── час 0-23 * , - /
│ │ │ ┌───────────── день месяца 1-31 * , - / L W ?
│ │ │ │ ┌───────────── месяц 1-12 или JAN-DEC * , - /
│ │ │ │ │ ┌───────────── день недели 0-6 или SUN-SAT * , - / # L ? Оба 0 и 7 означают SUN
│ │ │ │ │ │
* * * * * *
Во всех полях вы можете использовать число, *
для обозначения поля как любое значение, -
для указания диапазонов значений. Обратные диапазоны, такие как 22-1
(эквивалент 22,23,0,1,2
), также поддерживаются.
Можно определить шаг, комбинируя /
с *
, числами и диапазонами. Например, */5
в поле минут описывает каждые 5 минут, а 1-15/3
в поле дня месяца — каждые 3 дня с 1 по 15. Обратите внимание, что */24
эквивалентно 0,24,48
, и */24
в поле минут буквально не означает каждые 24 минуты, это означает каждые 0,24,48 минут.
Объедините значения и диапазоны с помощью ,
. Запятая работает как оператор OR
. Так 3,5-11/3,12
эквивалентен 3,5,8,11,12
.
В полях месяца и дня недели вы можете использовать названия месяцев или дней недели, сокращённые до первых трёх букв (Jan-Dec
или Mon-Sun
) вместо их числовых значений. Полные имена, такие как JANUARY
или MONDAY
, не поддерживаются.
Для поля дня недели и 0, и 7 обозначают воскресенье, 1 — понедельник.
Выражение | Описание |
---|---|
* * * * * |
|
------------------------------------------------------------------------------------ | |
0 0 1 * * |
В полночь первого числа каждого месяца |
*/5 * * * * |
Каждые 5 минут |
30,45-15/2 1 * * * |
С 01:00 до 01:15 и с 01:45 до 01:59 и в 01:30 |
0 0 * * MON-FRI |
В 00:00 с понедельника по пятницу |
Большинство выражений можно описать с помощью базовых символов. Если вы хотите работать со сложными случаями, такими как последний день месяца или вторая суббота, используйте специальные символы:
L
обозначает «последний». При использовании в поле дня недели позволяет указать такие конструкции, как последняя пятница (5L
или FRIL
). В поле дня месяца указывает на последний день месяца.
W
в поле дня месяца — ближайший рабочий день. Используйте W
с одним значением (не диапазонами, шагами или *
), чтобы определить ближайший рабочий день к заданному дню. В этом случае есть два основных правила для определения возникновения: мы должны перейти к ближайшему рабочему дню и не можем перейти на другой месяц. Таким образом, если данный день — суббота, мы переходим к пятнице, а если это воскресенье, то к понедельнику. Но если данный день — первый день месяца (например, 0 0 1W * *
), и это суббота, мы перейдём к третьему понедельнику, а если последний день месяца (0 0 31W 0 0
), и это воскресенье — к пятнице. Смешивайте символы L
(необязательно с смещением) и W
, чтобы указать последний рабочий день месяца LW
или более сложный, например L-5W
.
#
в поле дня недели позволяет указывать такие конструкции, как вторая суббота (6#2
или SAT#2
).
?
является синонимом *
. Он поддерживается, но не обязателен, поэтому 0 0 5 * ?
— это то же самое, что 0 0 5 * *
.
Выражение | Описание |
---|---|
0 0 L * * |
В 00:00 утра последнего дня месяца |
0 0 L-1 * * |
В 00:00 утра за день до последнего дня месяца |
0 0 3W * * |
В 00:00 утра третьего рабочего дня каждого месяца |
0 0 LW * * |
В 00:00 утра последнего рабочего дня месяца |
0 0 * * 2L |
В 00:00 утра последней среды месяца |
0 0 * * 6#3 |
В 00:00 утра третьей субботы месяца |
0 0 ? 1 MON#1 |
В 00:00 утра первого понедельника января |
Можно установить как день месяца, так и день недели, что позволяет указать конструкции типа пятница тринадцатое. Таким образом, 0 0 13 * 5
означает в 00:00 пятницы тринадцатого.
Это отличается от Unix crontab и Quartz cron реализаций. Crontab обрабатывает это как оператор OR
: событие может произойти в указанный день месяца или указанный день недели. Поэтому 0 0 13 * 5
означает в 00:00, каждую пятницу или каждое тринадцатое число месяца. Quartz не позволяет указать и день месяца, и день недели.
Макрос — это строка, начинающаяся с @
и представляющая собой ярлык для простых случаев, таких как каждый день или каждую минуту.
Макрос | Эквивалент | Комментарий |
---|---|---|
@every_second |
* * * * * * |
Выполнять раз в секунду |
@every_minute |
* * * * * |
Выполнять каждую минуту в начале минуты |
@hourly |
0 * * * * |
Выполнять каждый час в начале часа |
@daily |
0 0 * * * |
Выполнять один раз в день в полночь |
@midnight |
0 0 * * * |
Выполнять один раз в день в полночь |
@weekly |
0 0 * * 0 |
Выполнять один раз в неделю в полночь в воскресенье утром |
@monthly |
0 0 1 * * |
Выполнять один раз в месяц в полночь первого числа месяца |
@yearly |
0 0 1 1 * |
Выполнять один раз в год в полночь 1 января |
@annually |
0 0 1 1 * |
Выполнять один раз в год в полночь 1 января Следующие вхождения |
В результате Cronos работает быстрее, чем альтернативные библиотеки примерно на порядок. Вот небольшое сравнение:
Метод Cronos | Среднее значение | Стандартное отклонение |
---|---|---|
CronExpression.Parse("* * * * *") | 30,8473 нс | 0,0515 нс |
CronExpression.Parse("*/10 12-20 ? DEC 3") | 81,5010 нс | 0,0924 нс |
Simple.GetNextOccurrence(DateTime.UtcNow) | 123,4712 нс | 0,5928 нс |
Complex.GetNextOccurrence(DateTime.UtcNow) | 212,0422 нс | 0,3997 нс |
Метод NCrontab
Метод NCrontab | Среднее значение | Стандартное отклонение |
---|---|---|
CrontabSchedule.Parse("* * * * *") | 1 813,7313 нс | 3,3718 нс |
CrontabSchedule.Parse("*/10 12-20 * DEC 3") | 3 174,3625 нс | 6,8522 нс |
Simple.GetNextOccurrence(DateTime.UtcNow) | 147,7866 нс | 0,1689 нс |
Complex.GetNextOccurrence(DateTime.UtcNow) | 1 001,3253 нс | 1,6205 нс |
Метод Quartz
Метод Quartz | Среднее значение | Стандартное отклонение |
---|---|---|
new CronExpression("* * * * * ?") | 48 157,7744 нс | 1 417,3101 нс |
new CronExpression("* */10 12-20 ? DEC 3") | 33 731,9992 нс | 38,3192 нс |
Simple.GetTimeAfter(DateTimeOffset.Now) | 1 416,9867 нс | 1,2784 нс |
Complex.GetTimeAfter(DateTimeOffset.Now) | 6 573,0269 нс | 7,9192 нс |
Copyright © 2017 Sergey Odinokov. Cronos is licensed under [The MIT License (MIT)][LICENSE]. [LICENSE]: LICENSE
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )