NAME

Mojar::Cron::Date - Integer arithmetic for ISO dates

SYNOPSIS

say Mojar::Cron::Date->$_ for qw(yesterday today tomorrow);

DESCRIPTION

Methods for manipulating simple dates.

First, make a date. That should either be using your machine's local timezone:

$local_date = Mojar::Cron::Date->yesterday;
$local_date = Mojar::Cron::Date->today;
$local_date = Mojar::Cron::Date->tomorrow;

or using UTC:

$utc_date = Mojar::Cron::Date->current->previous;
$utc_date = Mojar::Cron::Date->current;
$utc_date = Mojar::Cron::Date->current->next;

or via a literal value:

$date = Mojar::Cron::Date->new('2005-02-14');

or by copying:

$copied_date = $date->new;

Then once you have a date, it is timezone-neutral -- you simply roll forwards or backwards.

$date->roll(1);
$date->roll_back(1);
$date->roll_back(7);
$date->roll(-7);
$date->roll_to(0);

Or you can go non-mutating by creating fresh dates equal to those values.

$future_date = $date->next;
$past_date = $date->previous;
$past_date = $date->before(7);
$past_date = $date->after(-7);
$soon_date = $date->new->roll_to(0);

PORTABILITY CAVEAT

This module makes heavy use of POSIX::strftime and is not expected to work on platforms where that is missing or faulty. It is tested regularly on linux.

CONSTRUCTORS

current

The date of the current UTC time.

$utc_date = Mojar::Cron::Date->current;

today

The date of the current local time.

$local_date = Mojar::Cron::Date->today;

tomorrow

The date after today.

$local_date = Mojar::Cron::Date->tomorrow;

yesterday

The date before today.

$local_date = Mojar::Cron::Date->yesterday;

METHODS

after

A non-mutating generator for a fresh date that is this many nights after the source (invoker) date.

$future_date = $date->after(28);

before

A non-mutating generator for a fresh date that is this many nights before the source (invoker) date.

$past_date = $date->before(28);

dow

The numeric weekday of this date.

$date->roll_to(1);  # Now on a Monday
my $dow_id = $date->dow;  # 1 : Mon

The answer will a number from 0 to 6, with 0 indicating Sunday and 6 Saturday.

format

$epoch_seconds = $date->format('%s')
$month_name = $date->format('%B')

Format the date to a string.

is_weekend

next

previous

roll

Roll date forwards by a number of nights.

$date->roll(1);  # next day
$date->roll(7);  # week later

roll_back

Roll date backwards by a number of nights.

$date->roll_back(1);  # previous day
$date->roll_back(7);  # week earlier

which are equivalent to

$date->roll(-1);
$date->roll(-7);

roll_to

Roll date forwards by the least amount to make it the specified weekday. The most it can roll forwards is 6 nights.

$date->roll_to(0);  # 0 : Sun
$date->roll_to(1);  # 1 : Mon
...
$date->roll_to(6);  # 6 : Sat

If $date is a Monday, then $date-roll_to(1)> will make no change since it is already on a Monday. On the other hand, $date-roll_to(0)> will make it roll forwards 6 nights to get to the following Sunday.

Like the other roll* methods, roll_to is also a mutator. For the non-mutating equivalent, first copy with new.

$soon = $date->new->roll_to(0);

sleeps (*linux only*)

How many sleeps till the specified date? The answer will be positive if given a future date, negative if given a past date.

$sleeps = $date->sleeps($my_next_birthday);

FUNCTIONS

sort

@sorted  = sort {$a cmp $b} @dates
@reverse = sort {$b cmp $a} @dates
@sorted  = sort {$a <=> $b} @dates
@reverse = sort {$b <=> $a} @dates

Built-in forward and reverse sorting works, giving the same result with either operator.

COPYRIGHT AND LICENCE

Copyright (C) 2016--2022, Nic Sandfield.

This program is free software, you can redistribute it and/or modify it under the terms of the Artistic License version 2.0.