Date-Business
view release on metacpan or search on metacpan
Business.pm view on Meta::CPAN
my($lt) = timegm(localtime());
$self->{'val'} = $lt - ($lt % DAY);
}
}
# compute offset if specified
if (defined($offset)) {
$self->addb($offset) if ($offset > 0);
$self->subb(-$offset) if ($offset < 0);
} else {
# if the date was initialized with a weekend or holiday
# and the FORCE option is set, force it to the 'next'
# or 'prev' business day
if (defined($params{FORCE})) {
if ($self->day_of_week == SATURDAY || $self->day_of_week == SUNDAY ||
(ref($self->{HOLIDAY}) eq 'CODE' &&
$self->{HOLIDAY}->($self->image, $self->image))) {
$self->prevb if ($self->{FORCE} eq 'prev');
$self->nextb if ($self->{FORCE} eq 'next');
}
}
}
return $self;
}
sub image2value($;$) {
my($image) = @_;
$image =~ m/(....)(..)(..)/;
return timegm(0, 0, 0, $3, ($2-1), $1 - 1900);
}
sub value($) {
my($self) = @_;
return $self->{'val'};
}
sub image($) {
my($self) = @_;
return POSIX::strftime("%Y%m%d", gmtime($self->{'val'}));
}
sub next(;$) {
my($self, $n) = @_;
$n = 1 if (!defined($n));
$self->{'val'} += DAY * $n;
}
sub prev(;$) {
my($self, $n) = @_;
$n = 1 if (!defined($n));
$self->{'val'} -= (DAY * $n);
}
sub datecmp($$) {
my($self, $other) = @_;
return $self->{'val'} <=> $other->{'val'};
}
sub eq($$) {
my($self, $other) = @_;
return $self->{'val'} <=> $other->{'val'};
}
sub gt($$) {
my($self, $other) = @_;
return $self->{'val'} > $other->{'val'};
}
sub lt($$) {
my($self, $other) = @_;
return $self->{'val'} < $other->{'val'};
}
sub add($$) {
my($self, $inc) = @_;
$self->{'val'} += $inc * DAY;
}
sub sub($$) {
my($self, $inc) = @_;
$self->{'val'} -= $inc * DAY;
}
sub diff($$) {
my($self, $other) = @_;
return int(($self->{'val'} - $other->{'val'}) / DAY);
}
sub day_of_week($$) {
my($self) = @_;
return (gmtime($self->{'val'}))[6];
}
# business date functions
sub nextb() {
my($self) = @_;
$self->addb(1);
}
sub prevb() {
my($self) = @_;
$self->subb(1);
}
# takes a reference to $self and a reference
# to an object of type Date::Business and returns
# the difference in business days
sub diffb($$;$$) {
my($self, $other, $force_self, $force_other) = @_;
return -1 if (!defined($other));
my($days, $o_val, $sval, $tmp, $dow);
my($sign) = 1;
$force_self ||= 'prev';
$force_other ||= 'prev';
$sval = $self->{val};
while ($force_self eq 'prev') {
$tmp = $sval;
$dow = (gmtime($sval))[6];
$sval -= 2 * DAY if ($dow == SUNDAY);
$sval -= 1 * DAY if ($dow == SATURDAY);
$sval -= 1 * DAY if (ref($self->{HOLIDAY}) eq 'CODE' &&
$self->{HOLIDAY}->(POSIX::strftime("%Y%m%d", gmtime($sval)),
POSIX::strftime("%Y%m%d", gmtime($sval))));
last if ($sval == $tmp);
}
( run in 1.522 second using v1.01-cache-2.11-cpan-8dfa8b56332 )