提交的内容
This commit is contained in:
0
vendor/dragonmantank/cron-expression/CHANGELOG.md
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/CHANGELOG.md
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/LICENSE
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/LICENSE
vendored
Executable file → Normal file
76
vendor/dragonmantank/cron-expression/README.md
vendored
Executable file → Normal file
76
vendor/dragonmantank/cron-expression/README.md
vendored
Executable file → Normal file
@ -1,7 +1,7 @@
|
||||
PHP Cron Expression Parser
|
||||
==========================
|
||||
|
||||
[](https://packagist.org/packages/dragonmantank/cron-expression) [](https://packagist.org/packages/dragonmantank/cron-expression) [](http://travis-ci.org/dragonmantank/cron-expression) [](https://github.styleci.io/repos/103715337)
|
||||
[](https://packagist.org/packages/dragonmantank/cron-expression) [](https://packagist.org/packages/dragonmantank/cron-expression) [](https://github.com/dragonmantank/cron-expression/actions/workflows/tests.yml) [](https://github.styleci.io/repos/103715337)
|
||||
|
||||
The PHP cron expression parser can parse a CRON expression, determine if it is
|
||||
due to run, calculate the next run date of the expression, and calculate the previous
|
||||
@ -55,23 +55,65 @@ CRON Expressions
|
||||
|
||||
A CRON expression is a string representing the schedule for a particular command to execute. The parts of a CRON schedule are as follows:
|
||||
|
||||
* * * * *
|
||||
- - - - -
|
||||
| | | | |
|
||||
| | | | |
|
||||
| | | | +----- day of week (0 - 7) (Sunday=0 or 7)
|
||||
| | | +---------- month (1 - 12)
|
||||
| | +--------------- day of month (1 - 31)
|
||||
| +-------------------- hour (0 - 23)
|
||||
+------------------------- min (0 - 59)
|
||||
```
|
||||
* * * * *
|
||||
- - - - -
|
||||
| | | | |
|
||||
| | | | |
|
||||
| | | | +----- day of week (0-7) (Sunday = 0 or 7) (or SUN-SAT)
|
||||
| | | +--------- month (1-12) (or JAN-DEC)
|
||||
| | +------------- day of month (1-31)
|
||||
| +----------------- hour (0-23)
|
||||
+--------------------- minute (0-59)
|
||||
```
|
||||
|
||||
This library also supports a few macros:
|
||||
Each part of expression can also use wildcard, lists, ranges and steps:
|
||||
|
||||
* `@yearly`, `@annually` - Run once a year, midnight, Jan. 1 - `0 0 1 1 *`
|
||||
* `@monthly` - Run once a month, midnight, first of month - `0 0 1 * *`
|
||||
* `@weekly` - Run once a week, midnight on Sun - `0 0 * * 0`
|
||||
* `@daily`, `@midnight` - Run once a day, midnight - `0 0 * * *`
|
||||
* `@hourly` - Run once an hour, first minute - `0 * * * *`
|
||||
- wildcard - match always
|
||||
- `* * * * *` - At every minute.
|
||||
- day of week and day of month also support `?`, an alias to `*`
|
||||
- lists - match list of values, ranges and steps
|
||||
- e.g. `15,30 * * * *` - At minute 15 and 30.
|
||||
- ranges - match values in range
|
||||
- e.g. `1-9 * * * *` - At every minute from 1 through 9.
|
||||
- steps - match every nth value in range
|
||||
- e.g. `*/5 * * * *` - At every 5th minute.
|
||||
- e.g. `0-30/5 * * * *` - At every 5th minute from 0 through 30.
|
||||
- combinations
|
||||
- e.g. `0-14,30-44 * * * *` - At every minute from 0 through 14 and every minute from 30 through 44.
|
||||
|
||||
You can also use macro instead of an expression:
|
||||
|
||||
- `@yearly`, `@annually` - At 00:00 on 1st of January. (same as `0 0 1 1 *`)
|
||||
- `@monthly` - At 00:00 on day-of-month 1. (same as `0 0 1 * *`)
|
||||
- `@weekly` - At 00:00 on Sunday. (same as `0 0 * * 0`)
|
||||
- `@daily`, `@midnight` - At 00:00. (same as `0 0 * * *`)
|
||||
- `@hourly` - At minute 0. (same as `0 * * * *`)
|
||||
|
||||
Day of month extra features:
|
||||
|
||||
- nearest weekday - weekday (Monday-Friday) nearest to the given day
|
||||
- e.g. `* * 15W * *` - At every minute on a weekday nearest to the 15th.
|
||||
- If you were to specify `15W` as the value, the meaning is: "the nearest weekday to the 15th of the month"
|
||||
So if the 15th is a Saturday, the trigger will fire on Friday the 14th.
|
||||
If the 15th is a Sunday, the trigger will fire on Monday the 16th.
|
||||
If the 15th is a Tuesday, then it will fire on Tuesday the 15th.
|
||||
- However, if you specify `1W` as the value for day-of-month,
|
||||
and the 1st is a Saturday, the trigger will fire on Monday the 3rd,
|
||||
as it will not 'jump' over the boundary of a month's days.
|
||||
- last day of the month
|
||||
- e.g. `* * L * *` - At every minute on a last day-of-month.
|
||||
- last weekday of the month
|
||||
- e.g. `* * LW * *` - At every minute on a last weekday.
|
||||
|
||||
Day of week extra features:
|
||||
|
||||
- nth day
|
||||
- e.g. `* * * * 7#4` - At every minute on 4th Sunday.
|
||||
- 1-5
|
||||
- Every day of week repeats 4-5 times a month. To target the last one, use "last day" feature instead.
|
||||
- last day
|
||||
- e.g. `* * * * 7L` - At every minute on the last Sunday.
|
||||
|
||||
Requirements
|
||||
============
|
||||
@ -85,3 +127,5 @@ Projects that Use cron-expression
|
||||
* Part of the [Laravel Framework](https://github.com/laravel/framework/)
|
||||
* Available as a [Symfony Bundle - setono/cron-expression-bundle](https://github.com/Setono/CronExpressionBundle)
|
||||
* Framework agnostic, PHP-based job scheduler - [Crunz](https://github.com/crunzphp/crunz)
|
||||
* Framework agnostic job scheduler - with locks, parallelism, per-second scheduling and more - [orisai/scheduler](https://github.com/orisai/scheduler)
|
||||
* Explain expression in English (and other languages) with [orisai/cron-expression-explainer](https://github.com/orisai/cron-expression-explainer)
|
||||
|
||||
6
vendor/dragonmantank/cron-expression/composer.json
vendored
Executable file → Normal file
6
vendor/dragonmantank/cron-expression/composer.json
vendored
Executable file → Normal file
@ -18,7 +18,6 @@
|
||||
"require-dev": {
|
||||
"phpstan/phpstan": "^1.0",
|
||||
"phpunit/phpunit": "^7.0|^8.0|^9.0",
|
||||
"phpstan/phpstan-webmozart-assert": "^1.0",
|
||||
"phpstan/extension-installer": "^1.0"
|
||||
},
|
||||
"autoload": {
|
||||
@ -38,6 +37,11 @@
|
||||
"phpstan": "./vendor/bin/phpstan analyze",
|
||||
"test": "phpunit"
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.x-dev"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"allow-plugins": {
|
||||
"ocramius/package-versions": true,
|
||||
|
||||
0
vendor/dragonmantank/cron-expression/src/Cron/AbstractField.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/AbstractField.php
vendored
Executable file → Normal file
27
vendor/dragonmantank/cron-expression/src/Cron/CronExpression.php
vendored
Executable file → Normal file
27
vendor/dragonmantank/cron-expression/src/Cron/CronExpression.php
vendored
Executable file → Normal file
@ -12,7 +12,6 @@ use Exception;
|
||||
use InvalidArgumentException;
|
||||
use LogicException;
|
||||
use RuntimeException;
|
||||
use Webmozart\Assert\Assert;
|
||||
|
||||
/**
|
||||
* CRON expression parser that can determine whether or not a CRON expression is
|
||||
@ -148,7 +147,7 @@ class CronExpression
|
||||
/**
|
||||
* @deprecated since version 3.0.2, use __construct instead.
|
||||
*/
|
||||
public static function factory(string $expression, FieldFactoryInterface $fieldFactory = null): CronExpression
|
||||
public static function factory(string $expression, ?FieldFactoryInterface $fieldFactory = null): CronExpression
|
||||
{
|
||||
/** @phpstan-ignore-next-line */
|
||||
return new static($expression, $fieldFactory);
|
||||
@ -179,7 +178,7 @@ class CronExpression
|
||||
* @param null|FieldFactoryInterface $fieldFactory Factory to create cron fields
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function __construct(string $expression, FieldFactoryInterface $fieldFactory = null)
|
||||
public function __construct(string $expression, ?FieldFactoryInterface $fieldFactory = null)
|
||||
{
|
||||
$shortcut = strtolower($expression);
|
||||
$expression = self::$registeredAliases[$shortcut] ?? $expression;
|
||||
@ -200,7 +199,12 @@ class CronExpression
|
||||
public function setExpression(string $value): CronExpression
|
||||
{
|
||||
$split = preg_split('/\s/', $value, -1, PREG_SPLIT_NO_EMPTY);
|
||||
Assert::isArray($split);
|
||||
|
||||
if (!\is_array($split)) {
|
||||
throw new InvalidArgumentException(
|
||||
$value . ' is not a valid CRON expression'
|
||||
);
|
||||
}
|
||||
|
||||
$notEnoughParts = \count($split) < 5;
|
||||
|
||||
@ -334,7 +338,10 @@ class CronExpression
|
||||
$currentTime = new DateTime($currentTime);
|
||||
}
|
||||
|
||||
Assert::isInstanceOf($currentTime, DateTime::class);
|
||||
if (!$currentTime instanceof DateTime) {
|
||||
throw new InvalidArgumentException('invalid current time');
|
||||
}
|
||||
|
||||
$currentTime->setTimezone(new DateTimeZone($timeZone));
|
||||
|
||||
$matches = [];
|
||||
@ -420,7 +427,10 @@ class CronExpression
|
||||
$currentTime = new DateTime($currentTime);
|
||||
}
|
||||
|
||||
Assert::isInstanceOf($currentTime, DateTime::class);
|
||||
if (!$currentTime instanceof DateTime) {
|
||||
throw new InvalidArgumentException('invalid current time');
|
||||
}
|
||||
|
||||
$currentTime->setTimezone(new DateTimeZone($timeZone));
|
||||
|
||||
// drop the seconds to 0
|
||||
@ -462,7 +472,10 @@ class CronExpression
|
||||
$currentDate = new DateTime('now');
|
||||
}
|
||||
|
||||
Assert::isInstanceOf($currentDate, DateTime::class);
|
||||
if (!$currentDate instanceof DateTime) {
|
||||
throw new InvalidArgumentException('invalid current date');
|
||||
}
|
||||
|
||||
$currentDate->setTimezone(new DateTimeZone($timeZone));
|
||||
// Workaround for setTime causing an offset change: https://bugs.php.net/bug.php?id=81074
|
||||
$currentDate = DateTime::createFromFormat("!Y-m-d H:iO", $currentDate->format("Y-m-d H:iP"), $currentDate->getTimezone());
|
||||
|
||||
0
vendor/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/FieldFactoryInterface.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/FieldFactoryInterface.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/FieldInterface.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/FieldInterface.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/HoursField.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/HoursField.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/MinutesField.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/MinutesField.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/MonthField.php
vendored
Executable file → Normal file
0
vendor/dragonmantank/cron-expression/src/Cron/MonthField.php
vendored
Executable file → Normal file
Reference in New Issue
Block a user