Algorithm-Cron
view release on metacpan or search on metacpan
lib/Algorithm/Cron.pm view on Meta::CPAN
=head1 DESCRIPTION
Objects in this class implement a time scheduling algorithm such as used by
F<cron(8)>. Objects are stateless once constructed, and represent a single
schedule as defined by a F<crontab(5)> entry. The object implements a method
C<next_time> which returns an epoch timestamp value to indicate the next time
included in the crontab schedule.
=head2 Crontabs
The schedule is provided as a set of acceptable values for each field of the
broken-down time (as returned by C<localtime> or C<gmtime>), either in a
single string called C<crontab> or by a set of named strings, each taking the
name of a F<crontab(5)> field.
my $cron = Algorithm::Cron->new(
base => 'local',
crontab => '0 9 * * mon-fri',
);
Z<>
my $cron = Algorithm::Cron->new(
base => 'local',
min => 0,
hour => 9,
wday => "mon-fri",
);
A C<crontab> field containing a single asterisk (C<*>), or a missing named
field, indicates that any value here is included in the scheduled times. To
restrict the schedule, a value or set of values can be provided. This should
consist of one or more comma-separated numbers or ranges, where a range is
given as the start and end points, both inclusive.
hour => "3-6"
hour => "3,4,5,6"
Ranges can also be prefixed by a value to give the increment for values in
that range.
min => "*/10"
min => "0,10,20,30,40,50"
The C<mon> and C<wday> fields also allow symbolic month or weekday names in
place of numeric values. These names are always in the C locale, regardless of
the system's locale settings.
mon => "mar-sep"
wday => "mon,wed,fri"
Specifying C<sun> as the end of a C<wday> range, or giving the numeric value
of C<7> is also supported.
wday => "fri-sun"
wday => "5-7"
# Both equivalent to: wday => "0,5,6"
As per F<cron(8)> behaviour, this algorithm looks for a match of the C<min>,
C<hour> and C<mon> fields, and at least one of the C<mday> or C<mday> fields.
If both C<mday> and C<wday> are specified, a match of either will be
sufficient.
As an extension, seconds may be provided either by passing six space-separated
fields in the C<crontab> string, or as an additional C<sec> field. If not
provided it will default to C<0>. If six fields are provided, the first gives
the seconds.
=head2 Time Base
C<Algorithm::Cron> supports using either UTC or the local timezone when
comparing against the given schedule.
=cut
# mday field starts at 1, others start at 0
my %MIN = (
sec => 0,
min => 0,
hour => 0,
mday => 1,
mon => 0
);
# These don't have to be real maxima, as the algorithm will cope. These are
# just the top end of the range expansions
my %MAX = (
sec => 59,
min => 59,
hour => 23,
mday => 31,
mon => 11,
wday => 6,
);
my %MONTHS;
my %WDAYS;
# These always want to be in LC_TIME=C
{
my $old_loc = setlocale( LC_TIME );
setlocale( LC_TIME, "C" );
%MONTHS = map { lc(strftime "%b", 0,0,0, 1, $_, 70), $_ } 0 .. 11;
# 0 = Sun. 4th Jan 1970 was a Sunday
%WDAYS = map { lc(strftime "%a", 0,0,0, 4+$_, 0, 70), $_ } 0 .. 6;
setlocale( LC_TIME, $old_loc );
}
sub _expand_set
{
my ( $spec, $kind ) = @_;
return undef if $spec eq "*";
my @vals;
foreach my $val ( split m/,/, $spec ) {
my $step = 1;
( run in 1.402 second using v1.01-cache-2.11-cpan-13bb782fe5a )