[![Build Status](https://travis-ci.org/ufobat/p6-time-crontab.svg?branch=master)](https://travis-ci.org/ufobat/p6-time-crontab)

NAME
====

Time::Crontab for raku

SYNOPSIS
========

	use Time::Crontab;
	my $crontab = "* * * * *";
	my $tc = Time::Crontab.new(:$crontab);
	if $tc.match(DateTime.now, :truncate(True)) { ..... }

METHODS
=======

* `new(Str :$crontab!, Int :$timezone = 0) returns DateTime:D`

* `match(DateTime $datetime, Bool :$truncate = False) returns Bool:D`

Matches the $datetime against the crontab specification. Since the crontab's smallest granulation is minute wise there is a option to $truncate the $datetime to minutes when it comes to consideration if the $datetime matches the $crontab.

* `next-datetime(DateTime $datetie) returns DateTime:D`

Calculates the next execution right after $datetime.

SYNTAX OF THE CRONTAB
=====================

    Field name   Allowed values  Allowed special characters
    Minutes      0-59            * / , - !
    Hours        0-23            * / , - !
    Day of month 1-31            * / , - !
    Month        1-12 or JAN-DEC * / , - !
    Day of week  0-6 or SUN-SAT  * / , - !

* `*` means anything. The actual values depends on the field.
* `/` is a stepping. This special character must be followed bit a number, which decribes the step size.
* `,` can be used to list different values, or ranges.
* `-` indicates a range.
* `!` excludes a value.

The names of the month or day of the week are the first 3 characters of their english names. They are case insensetive.

DAY OF MONTH VS DAY OF WEEK
===========================

The Handling of the Day of Week and Day of Month is quite delicate. In the case that the Day of Week field is set to any (*) you basically dont care for it.

This is borrowd from the crontab 5 manpage

     Note: The day of a command's execution can be specified by two fields — day of month, and day of week.  If both fields are restricted (i.e., aren't *), the command  will  be
     run when either field matches the current time.  For example,
     ``30  4  1,15 * 5'' would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday. One can, however, achieve the desired result by adding a
     test to the command (see the last example in EXAMPLE CRON FILE below).

     # run five minutes after midnight, every day
     5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
     # run at 2:15pm on the first of every month -- output mailed to paul
     15 14 1 * *     $HOME/bin/monthly
     # run at 10 pm on weekdays, annoy Joe
     0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
     23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
     5 4 * * sun     echo "run at 5 after 4 every sunday"
     # Run on every second Saturday of the month
     0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "2nd Saturday"
