Mojar-Cron

 view release on metacpan or  search on metacpan

lib/Mojar/Cron/Date.pm  view on Meta::CPAN

package Mojar::Cron::Date;
use Mojo::Base -strict;

our $VERSION = 0.021;

use Carp qw(croak);
use POSIX qw(strftime);
use Scalar::Util qw(blessed);

use overload
  '""'  => sub { ${$_[0]} },
  '<=>' => sub { (${$_[0]} cmp $_[1]) * ($_[2] ? -1 : 1) },
  fallback => 1;

sub new {
  my $proto = shift;
  my $class = ref $proto || $proto;
  my $payload = @_ ? shift : ref $proto ? $$proto : $class->today;
  bless \$payload => $class;
}

sub today {
  my ($d, $m , $y) = (localtime)[3, 4, 5];
  return shift->new(sprintf '%04u-%02u-%02u', $y + 1900, $m + 1, $d);
}

sub current {
  my ($d, $m , $y) = (gmtime)[3, 4, 5];
  return shift->new(sprintf '%04u-%02u-%02u', $y + 1900, $m + 1, $d);
}

sub roll {
  my ($self, $days) = @_;
  croak 'Not a class method' unless ref $self;
  croak "Bad date format ($$self)" unless $$self =~ /^(\d{4})-(\d\d)-(\d\d)\b/a;
  $$self = strftime '%Y-%m-%d', 0, 0, 12, $3 + ($days // 0), $2 - 1, $1 - 1900;
  return $self;
}

sub roll_back { shift->roll(-(shift // 0)) }

sub after { shift->new->roll(shift) }

sub before { shift->new->roll(-(shift // 0)) }

sub next { shift->new->roll(1) }

sub previous { shift->new->roll(-1) }

sub tomorrow { shift->today->roll(1) }

sub yesterday { shift->today->roll(-1) }

sub format {
  my ($self, $format, $date) = @_;
  $date ||= ref $self ? $$self : croak 'Missing required date';
  croak "Bad date format ($date)" unless $date =~ /^(\d{4})-(\d\d)-(\d\d)\b/a;
  die "Unsupported platform ($^O)" unless $^O eq 'linux';
  strftime($format || '%Y-%m-%d', 0, 0, 0, $3, $2 - 1, $1 - 1900);
}

sub dow { shift->format('%u', @_) }

sub yearweek { shift->format('%G%V', @_) }

sub yearweekday { shift->format('%GW%V%u', @_) }

sub is_weekend {
  my $self = shift;
  my $dow = $self->dow(shift);
  $dow == 6 or $dow == 7;
}

sub roll_to {
  my ($self, $dow) = @_;
  croak 'Missing required day-of-the-week' unless defined $dow;
  my $day = $self->dow;
  $self->roll(($dow - $day) % 7);
}

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 0.920 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )