1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Longbow-Cronos

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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 — это маска для определения фиксированных времён, дат и интервалов. Маска состоит из полей секунды (необязательно), минуты, часа, дня месяца, месяца и дня недели. Все поля позволяют вам указать несколько значений, и любая заданная дата/время будет соответствовать указанному выражению 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 нс

License

Copyright © 2017 Sergey Odinokov. Cronos is licensed under [The MIT License (MIT)][LICENSE]. [LICENSE]: LICENSE

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Библиотека для анализа выражений Cron. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/Longbow-Cronos.git
git@api.gitlife.ru:oschina-mirror/Longbow-Cronos.git
oschina-mirror
Longbow-Cronos
Longbow-Cronos
master