The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


Algorithm::Cron - abstract implementation of the cron(8) scheduling algorithm


 use Algorithm::Cron;

 my $cron = Algorithm::Cron->new(
    base => 'local',
    crontab => "*/10 9-17 * * *",

 my $time = time;
 while(1) {
    $time = $cron->next_time( $time );

    sleep( time - $time );

    print "Do something\n";


Objects in this class implement a time scheduling algorithm such as used by cron(8). Objects are stateless once constructed, and represent a single schedule as defined by a crontab(5) entry. The object implements a method next_time which returns an epoch timestamp value to indicate the next time included in the crontab schedule.


The schedule is provided as a set of acceptable values for each field of the broken-down time (as returned by localtime or gmtime), either in a single string called crontab or by a set of named strings, each taking the name of a crontab(5) field.

 my $cron = Algorithm::Cron->new(
    base => 'local',
    crontab => '0 9 * * mon-fri',

 my $cron = Algorithm::Cron->new(
    base => 'local',
    min  => 0,
    hour => 9,
    wday => "mon-fri",

A crontab field containing a single asterisk (*), 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 mon and 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 sun as the end of a wday range, or giving the numeric value of 7 is also supported.

 wday => "fri-sun"
 wday => "5-7"
 # Both equivalent to: wday => "0,5,6"

As per cron(8) behaviour, this algorithm looks for a match of the min, hour and mon fields, and at least one of the mday or mday fields. If both mday and 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 crontab string, or as an additional sec field. If not provided it will default to 0. If six fields are provided, the first gives the seconds.

Time Base

Algorithm::Cron supports using either UTC or the local timezone when comparing against the given schedule.


$cron = Algorithm::Cron->new( %args )

Constructs a new Algorithm::Cron object representing the given schedule relative to the given time base. Takes the following named arguments:

base => STRING

Gives the time base used for scheduling. Either utc or local.

crontab => STRING

Gives the crontab schedule in 5 or 6 space-separated fields.

sec => STRING, min => STRING, ... mon => STRING

Optional. Gives the schedule in a set of individual fields, if the crontab field is not specified.


@seconds = $cron->sec

@minutes = $cron->min

@hours = $cron->hour

@mdays = $cron->mday

@months = $cron->mon

@wdays = $cron->wday

Accessors that return a list of the accepted values for each scheduling field. These are returned in a plain list of numbers, regardless of the form they were specified to the constructor.

Also note that the list of valid months will be 0-based (in the range 0 to 11) rather than 1-based, to match the values used by localtime, gmtime, mktime and timegm.

$time = $cron->next_time( $start_time )

Returns the next scheduled time, as an epoch timestamp, after the given timestamp. This is a stateless operation; it does not change any state stored by the $cron object.


Paul Evans <>