Blame lib/Date/Manip/DM6.pm

Packit 95306a
package Date::Manip::DM6;
Packit 95306a
# Copyright (c) 1995-2017 Sullivan Beck.  All rights reserved.
Packit 95306a
# This program is free software; you can redistribute it and/or modify it
Packit 95306a
# under the same terms as Perl itself.
Packit 95306a
Packit 95306a
###########################################################################
Packit 95306a
###########################################################################
Packit 95306a
Packit 95306a
our (@ISA,@EXPORT);
Packit 95306a
Packit 95306a
require 5.010000;
Packit 95306a
require Exporter;
Packit 95306a
@ISA = qw(Exporter);
Packit 95306a
@EXPORT = qw(
Packit 95306a
   DateManipVersion
Packit 95306a
   Date_Init
Packit 95306a
   ParseDate
Packit 95306a
   ParseDateString
Packit 95306a
   ParseDateDelta
Packit 95306a
   ParseDateFormat
Packit 95306a
   ParseRecur
Packit 95306a
   Date_IsHoliday
Packit 95306a
   Date_IsWorkDay
Packit 95306a
   Date_Cmp
Packit 95306a
   DateCalc
Packit 95306a
   UnixDate
Packit 95306a
   Delta_Format
Packit 95306a
   Date_GetPrev
Packit 95306a
   Date_GetNext
Packit 95306a
   Date_SetTime
Packit 95306a
   Date_SetDateField
Packit 95306a
   Events_List
Packit 95306a
   Date_NextWorkDay
Packit 95306a
   Date_PrevWorkDay
Packit 95306a
   Date_NearestWorkDay
Packit 95306a
Packit 95306a
   Date_DayOfWeek
Packit 95306a
   Date_SecsSince1970
Packit 95306a
   Date_SecsSince1970GMT
Packit 95306a
   Date_DaysSince1BC
Packit 95306a
   Date_DayOfYear
Packit 95306a
   Date_NthDayOfYear
Packit 95306a
   Date_DaysInMonth
Packit 95306a
   Date_DaysInYear
Packit 95306a
   Date_WeekOfYear
Packit 95306a
   Date_LeapYear
Packit 95306a
   Date_DaySuffix
Packit 95306a
   Date_ConvTZ
Packit 95306a
   Date_TimeZone
Packit 95306a
);
Packit 95306a
Packit 95306a
use strict;
Packit 95306a
use integer;
Packit 95306a
use warnings;
Packit 95306a
Packit 95306a
our $VERSION;
Packit 95306a
$VERSION='6.60';
Packit 95306a
Packit 95306a
###########################################################################
Packit 95306a
Packit 95306a
our ($dmb,$dmt,$date,$delta,$recur,$date2,$dateUT);
Packit 95306a
use Date::Manip::Date;
Packit 95306a
Packit 95306a
$dateUT = new Date::Manip::Date;
Packit 95306a
$dateUT->config('setdate','now,Etc/GMT');
Packit 95306a
Packit 95306a
$date   = new Date::Manip::Date;
Packit 95306a
$date2  = $date->new_date();
Packit 95306a
$delta  = $date->new_delta();
Packit 95306a
$recur  = $date->new_recur();
Packit 95306a
$dmb    = $date->base();
Packit 95306a
$dmt    = $date->tz();
Packit 95306a
Packit 95306a
########################################################################
Packit 95306a
########################################################################
Packit 95306a
# THESE ARE THE MAIN ROUTINES
Packit 95306a
########################################################################
Packit 95306a
########################################################################
Packit 95306a
Packit 95306a
sub DateManipVersion {
Packit 95306a
   my($flag) = @_;
Packit 95306a
   return $date->version($flag);
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_Init {
Packit 95306a
   my(@args) = @_;
Packit 95306a
   my(@args2);
Packit 95306a
Packit 95306a
   foreach my $arg (@args) {
Packit 95306a
      if ($arg =~ /^(\S+)\s*=\s*(.*)$/) {
Packit 95306a
         push(@args2,$1,$2);
Packit 95306a
      } else {
Packit 95306a
         warn "ERROR: invalid Date_Init argument: $arg\n";
Packit 95306a
      }
Packit 95306a
   }
Packit 95306a
   $date->config(@args2);
Packit 95306a
   return $date->err();
Packit 95306a
}
Packit 95306a
Packit 95306a
sub ParseDateString {
Packit 95306a
   my($string,@opts) = @_;
Packit 95306a
   $string = ''  if (! defined($string));
Packit 95306a
   my $err = $date->parse($string,@opts);
Packit 95306a
   return ''  if ($err);
Packit 95306a
   my $ret = $date->value('local');
Packit 95306a
   return $ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub ParseDateFormat {
Packit 95306a
   my($format,$string) = @_;
Packit 95306a
   $string = ''  if (! defined($string));
Packit 95306a
   my $err = $date->parse_format($format,$string);
Packit 95306a
   return ''  if ($err);
Packit 95306a
   my $ret = $date->value('local');
Packit 95306a
   return $ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub ParseDate {
Packit 95306a
   my($arg,@opts) = @_;
Packit 95306a
Packit 95306a
   $arg     = ''  if (! defined($arg));
Packit 95306a
   my $ref  = ref($arg);
Packit 95306a
   my $list = 0;
Packit 95306a
Packit 95306a
   my @args;
Packit 95306a
   if (! $ref) {
Packit 95306a
      @args = ($arg);
Packit 95306a
   } elsif ($ref eq 'ARRAY') {
Packit 95306a
      @args = @$arg;
Packit 95306a
      $list = 1;
Packit 95306a
   } elsif ($ref eq 'SCALAR') {
Packit 95306a
      @args = ($$arg);
Packit 95306a
   } else {
Packit 95306a
      print "ERROR:  Invalid arguments to ParseDate.\n";
Packit 95306a
      return '';
Packit 95306a
   }
Packit 95306a
Packit 95306a
   while (@args) {
Packit 95306a
      my $string = join(' ',@args);
Packit 95306a
      my $err = $date->parse($string,@opts);
Packit 95306a
      if (! $err) {
Packit 95306a
         splice(@$arg,0,$#args+1)  if ($list);
Packit 95306a
         my $ret = $date->value('local');
Packit 95306a
         return $ret;
Packit 95306a
      }
Packit 95306a
      pop(@args);
Packit 95306a
   }
Packit 95306a
Packit 95306a
   return '';
Packit 95306a
}
Packit 95306a
Packit 95306a
sub ParseDateDelta {
Packit 95306a
   my(@a) = @_;
Packit 95306a
Packit 95306a
   if (@a < 1  ||  @a > 2) {
Packit 95306a
      print "ERROR:  Invalid number of arguments to ParseDateDelta.\n";
Packit 95306a
      return '';
Packit 95306a
   }
Packit 95306a
   my($args,$mode) = @_;
Packit 95306a
   $args    = ''  if (! defined($args));
Packit 95306a
   $mode    = ''  if (! $mode);
Packit 95306a
   $mode    = lc($mode);
Packit 95306a
   if ($mode  &&  ($mode ne 'exact'  &&  $mode ne 'semi'  &&  $mode ne 'approx')) {
Packit 95306a
      print "ERROR:  Invalid arguments to ParseDateDelta.\n";
Packit 95306a
      return '';
Packit 95306a
   }
Packit 95306a
Packit 95306a
   my @args;
Packit 95306a
   my $ref  = ref($args);
Packit 95306a
   my $list = 0;
Packit 95306a
Packit 95306a
   if (! $ref) {
Packit 95306a
      @args = ($args);
Packit 95306a
   } elsif ($ref eq 'ARRAY') {
Packit 95306a
      @args = @$args;
Packit 95306a
      $list = 1;
Packit 95306a
   } elsif ($ref eq 'SCALAR') {
Packit 95306a
      @args = ($$args);
Packit 95306a
   } else {
Packit 95306a
      print "ERROR:  Invalid arguments to ParseDateDelta.\n";
Packit 95306a
      return '';
Packit 95306a
   }
Packit 95306a
Packit 95306a
   while (@args) {
Packit 95306a
      my $string = join(' ',@args);
Packit 95306a
      my $err = $delta->parse($string);
Packit 95306a
      if (! $err) {
Packit 95306a
         $delta->convert($mode)  if ($mode);
Packit 95306a
         splice(@$args,0,$#args+1)  if ($list);
Packit 95306a
         my $ret = $delta->value('local');
Packit 95306a
         return $ret;
Packit 95306a
      }
Packit 95306a
      pop(@args);
Packit 95306a
   }
Packit 95306a
Packit 95306a
   return '';
Packit 95306a
}
Packit 95306a
Packit 95306a
sub UnixDate {
Packit 95306a
   my($string,@in) = @_;
Packit 95306a
   my(@ret);
Packit 95306a
Packit 95306a
   my $err = $date->parse($string);
Packit 95306a
   return ()  if ($err);
Packit 95306a
Packit 95306a
   foreach my $in (@in) {
Packit 95306a
      push(@ret,$date->printf($in));
Packit 95306a
   }
Packit 95306a
Packit 95306a
   if (! wantarray) {
Packit 95306a
      return join(" ",@ret);
Packit 95306a
   }
Packit 95306a
   return @ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Delta_Format {
Packit 95306a
   my($string,@args) = @_;
Packit 95306a
Packit 95306a
   my $err = $delta->parse($string);
Packit 95306a
   return ()  if ($err);
Packit 95306a
Packit 95306a
   my($mode,$dec,@in);
Packit 95306a
   if (! defined($args[0])) {
Packit 95306a
      $mode = 'exact';
Packit 95306a
      @in = @args;
Packit 95306a
      shift(@in);
Packit 95306a
Packit 95306a
   } elsif (lc($args[0]) eq 'exact'  ||
Packit 95306a
            lc($args[0]) eq 'approx' ||
Packit 95306a
            lc($args[0]) eq 'semi') {
Packit 95306a
      ($mode,$dec,@in) = (@args);
Packit 95306a
      $mode = lc($mode);
Packit 95306a
Packit 95306a
   } elsif ($args[0] =~ /^\d+$/) {
Packit 95306a
      ($mode,$dec,@in) = ('exact',@args);
Packit 95306a
Packit 95306a
   } else {
Packit 95306a
      $mode = 'exact';
Packit 95306a
      @in = @args;
Packit 95306a
   }
Packit 95306a
Packit 95306a
   $dec = 0  if (! $dec);
Packit 95306a
   @in = _Delta_Format_old($mode,$dec,@in);
Packit 95306a
Packit 95306a
   my @ret = ();
Packit 95306a
   foreach my $in (@in) {
Packit 95306a
      push(@ret,$delta->printf($in));
Packit 95306a
   }
Packit 95306a
Packit 95306a
   if (! wantarray) {
Packit 95306a
      return join(" ",@ret);
Packit 95306a
   }
Packit 95306a
Packit 95306a
   return @ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub _Delta_Format_old {
Packit 95306a
   my($mode,$dec,@in) = @_;
Packit 95306a
   my(@ret);
Packit 95306a
   my $business = $delta->type('business');
Packit 95306a
Packit 95306a
   foreach my $in (@in) {
Packit 95306a
      my $out = '';
Packit 95306a
Packit 95306a
      # This will look for old formats (%Xd, %Xh, %Xt) and turn them
Packit 95306a
      # into the new format: %XYZ
Packit 95306a
Packit 95306a
      while ($in) {
Packit 95306a
         if ($in =~ s/^([^%]+)//) {
Packit 95306a
            $out .= $1;
Packit 95306a
Packit 95306a
         } elsif ($in =~ /^%[yMwdhms][yMwdhms][yMwdhms]/) {
Packit 95306a
            # It's one of the new formats so don't modify it.
Packit 95306a
            $in   =~ s/^%//;
Packit 95306a
            $out .= '%';
Packit 95306a
Packit 95306a
         } elsif ($in =~ s/^%([yMwdhms])([dht])//) {
Packit 95306a
            my($field,$scope) = ($1,$2);
Packit 95306a
            $out .= '%';
Packit 95306a
Packit 95306a
            if ($scope eq 'd') {
Packit 95306a
               if      ($mode eq 'approx') {
Packit 95306a
                  $out .= ".${dec}${field}${field}s";
Packit 95306a
               } elsif ($field eq 'y'  ||  $field eq 'M') {
Packit 95306a
                  $out .= ".${dec}${field}${field}M";
Packit 95306a
               } elsif ($mode eq 'semi') {
Packit 95306a
                  $out .= ".${dec}${field}${field}s";
Packit 95306a
               } elsif ($field eq 'w'  &&  $business) {
Packit 95306a
                  $out .= ".${dec}www";
Packit 95306a
               } elsif (($field eq 'w'  ||  $field eq 'd')  &&  ! $business) {
Packit 95306a
                  $out .= ".${dec}${field}${field}d";
Packit 95306a
               } else {
Packit 95306a
                  $out .= ".${dec}${field}${field}s";
Packit 95306a
               }
Packit 95306a
Packit 95306a
            } elsif ($scope eq 'h') {
Packit 95306a
               if      ($mode eq 'approx') {
Packit 95306a
                  $out .= ".${dec}${field}y${field}";
Packit 95306a
               } elsif ($field eq 'y'  ||  $field eq 'M') {
Packit 95306a
                  $out .= ".${dec}${field}y${field}";
Packit 95306a
               } elsif ($mode eq 'semi') {
Packit 95306a
                  $out .= ".${dec}${field}w${field}";
Packit 95306a
               } elsif ($field eq 'w') {
Packit 95306a
                  $out .= ".${dec}www";
Packit 95306a
               } elsif ($field eq 'd'  &&  ! $business) {
Packit 95306a
                  $out .= ".${dec}dwd";
Packit 95306a
               } elsif ($business) {
Packit 95306a
                  $out .= ".${dec}${field}d${field}";
Packit 95306a
               } else {
Packit 95306a
                  $out .= ".${dec}${field}h${field}";
Packit 95306a
               }
Packit 95306a
Packit 95306a
            } elsif ($scope eq 't') {
Packit 95306a
               if      ($mode eq 'approx') {
Packit 95306a
                  $out .= ".${dec}${field}ys";
Packit 95306a
               } elsif ($field eq 'y'  ||  $field eq 'M') {
Packit 95306a
                  $out .= ".${dec}${field}yM";
Packit 95306a
               } elsif ($mode eq 'semi') {
Packit 95306a
                  $out .= ".${dec}${field}ws";
Packit 95306a
               } elsif ($field eq 'w'  &&  $business) {
Packit 95306a
                  $out .= ".${dec}www";
Packit 95306a
               } elsif (($field eq 'w'  ||  $field eq 'd')  &&  ! $business) {
Packit 95306a
                  $out .= ".${dec}${field}wd";
Packit 95306a
               } elsif ($business) {
Packit 95306a
                  $out .= ".${dec}${field}ds";
Packit 95306a
               } else {
Packit 95306a
                  $out .= ".${dec}${field}hs";
Packit 95306a
               }
Packit 95306a
            }
Packit 95306a
Packit 95306a
         } else {
Packit 95306a
            # It's one of the new formats so don't modify it.
Packit 95306a
            $in =~ s/^%//;
Packit 95306a
            $out .= '%';
Packit 95306a
         }
Packit 95306a
      }
Packit 95306a
Packit 95306a
      push(@ret,$out);
Packit 95306a
   }
Packit 95306a
Packit 95306a
   return @ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub DateCalc {
Packit 95306a
   my($d1,$d2,@args) = @_;
Packit 95306a
Packit 95306a
   # Handle \$err arg
Packit 95306a
Packit 95306a
   my($ref,$errref);
Packit 95306a
Packit 95306a
   if (@args  &&  ref($args[0])) {
Packit 95306a
      $errref = shift(@args);
Packit 95306a
      $ref    = 1;
Packit 95306a
   } else {
Packit 95306a
      $ref    = 0;
Packit 95306a
   }
Packit 95306a
Packit 95306a
   # Parse $d1 and $d2
Packit 95306a
Packit 95306a
   my ($obj1,$obj2,$err,$usemode);
Packit 95306a
   $usemode = 1;
Packit 95306a
Packit 95306a
   $obj1 = $date->new_date();
Packit 95306a
   $err  = $obj1->parse($d1,'nodelta');
Packit 95306a
   if ($err) {
Packit 95306a
      $obj1 = $date->new_delta();
Packit 95306a
      $err  = $obj1->parse($d1);
Packit 95306a
      if ($err) {
Packit 95306a
         $$errref = 1  if ($ref);
Packit 95306a
         return '';
Packit 95306a
      }
Packit 95306a
      $usemode = 0;
Packit 95306a
   }
Packit 95306a
Packit 95306a
   $obj2 = $date->new_date();
Packit 95306a
   $err  = $obj2->parse($d2,'nodelta');
Packit 95306a
   if ($err) {
Packit 95306a
      $obj2 = $date->new_delta();
Packit 95306a
      $err  = $obj2->parse($d2);
Packit 95306a
      if ($err) {
Packit 95306a
         $$errref = 2  if ($ref);
Packit 95306a
         return '';
Packit 95306a
      }
Packit 95306a
      $usemode = 0;
Packit 95306a
   }
Packit 95306a
Packit 95306a
   # Handle $mode
Packit 95306a
Packit 95306a
   my($mode);
Packit 95306a
   if (@args) {
Packit 95306a
      $mode = shift(@args);
Packit 95306a
   }
Packit 95306a
   if (@args) {
Packit 95306a
      $$errref = 3  if ($ref);
Packit 95306a
      return '';
Packit 95306a
   }
Packit 95306a
Packit 95306a
   # Apply the $mode to any deltas
Packit 95306a
Packit 95306a
   if (defined($mode)) {
Packit 95306a
      if (ref($obj1) eq 'Date::Manip::Delta') {
Packit 95306a
         if ($$obj1{'data'}{'gotmode'}) {
Packit 95306a
            if ($mode == 2  ||  $mode == 3) {
Packit 95306a
               if (! $obj1->type('business')) {
Packit 95306a
                  $$errref = 3  if ($ref);
Packit 95306a
                  return '';
Packit 95306a
               }
Packit 95306a
            } else {
Packit 95306a
               if ($obj1->type('business')) {
Packit 95306a
                  $$errref = 3  if ($ref);
Packit 95306a
                  return '';
Packit 95306a
               }
Packit 95306a
            }
Packit 95306a
         } else {
Packit 95306a
            if ($mode == 2  ||  $mode == 3) {
Packit 95306a
               $obj1->set('mode','business');
Packit 95306a
            } else {
Packit 95306a
               $obj1->set('mode','normal');
Packit 95306a
            }
Packit 95306a
         }
Packit 95306a
      }
Packit 95306a
Packit 95306a
      if (ref($obj2) eq 'Date::Manip::Delta') {
Packit 95306a
         if ($$obj2{'data'}{'gotmode'}) {
Packit 95306a
            if ($mode == 2  ||  $mode == 3) {
Packit 95306a
               if (! $obj2->type('business')) {
Packit 95306a
                  $$errref = 3  if ($ref);
Packit 95306a
                  return '';
Packit 95306a
               }
Packit 95306a
            } else {
Packit 95306a
               if ($obj2->type('business')) {
Packit 95306a
                  $$errref = 3  if ($ref);
Packit 95306a
                  return '';
Packit 95306a
               }
Packit 95306a
            }
Packit 95306a
         } else {
Packit 95306a
            if ($mode ==2  ||  $mode == 3) {
Packit 95306a
               $obj2->set('mode','business');
Packit 95306a
            } else {
Packit 95306a
               $obj2->set('mode','normal');
Packit 95306a
            }
Packit 95306a
         }
Packit 95306a
      }
Packit 95306a
   }
Packit 95306a
Packit 95306a
   # Do the calculation
Packit 95306a
Packit 95306a
   my $obj3;
Packit 95306a
   if ($usemode) {
Packit 95306a
      $mode = 'exact'  if (! $mode);
Packit 95306a
      my %tmp = ('0'       => 'exact',
Packit 95306a
                 '1'       => 'approx',
Packit 95306a
                 '2'       => 'bapprox',
Packit 95306a
                 '3'       => 'business',
Packit 95306a
                 'exact'   => 'exact',
Packit 95306a
                 'semi'    => 'semi',
Packit 95306a
                 'approx'  => 'approx',
Packit 95306a
                 'business'=> 'business',
Packit 95306a
                 'bsemi'   => 'bsemi',
Packit 95306a
                 'bapprox' => 'bapprox',
Packit 95306a
                );
Packit 95306a
Packit 95306a
      if (exists $tmp{$mode}) {
Packit 95306a
         $mode = $tmp{$mode};
Packit 95306a
      } else {
Packit 95306a
         $$errref = 3  if ($ref);
Packit 95306a
         return '';
Packit 95306a
      }
Packit 95306a
Packit 95306a
      $obj3 = $obj1->calc($obj2,$mode);
Packit 95306a
   } else {
Packit 95306a
      $obj3 = $obj1->calc($obj2);
Packit 95306a
   }
Packit 95306a
Packit 95306a
   my $ret = $obj3->value();
Packit 95306a
   return $ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_GetPrev {
Packit 95306a
   my($string,$dow,$curr,@time) = @_;
Packit 95306a
   my $err = $date->parse($string);
Packit 95306a
   return ''  if ($err);
Packit 95306a
Packit 95306a
   if (defined($dow)) {
Packit 95306a
      $dow = lc($dow);
Packit 95306a
      if      (exists $$dmb{'data'}{'wordmatch'}{'day_char'}{$dow}) {
Packit 95306a
         $dow = $$dmb{'data'}{'wordmatch'}{'day_char'}{$dow};
Packit 95306a
      } elsif (exists $$dmb{'data'}{'wordmatch'}{'day_abb'}{$dow}) {
Packit 95306a
         $dow = $$dmb{'data'}{'wordmatch'}{'day_abb'}{$dow};
Packit 95306a
      } elsif (exists $$dmb{'data'}{'wordmatch'}{'day_name'}{$dow}) {
Packit 95306a
         $dow = $$dmb{'data'}{'wordmatch'}{'day_name'}{$dow};
Packit 95306a
      }
Packit 95306a
   }
Packit 95306a
Packit 95306a
   if ($#time == 0) {
Packit 95306a
      @time = @{ $dmb->split('hms',$time[0]) };
Packit 95306a
   }
Packit 95306a
Packit 95306a
   if (@time) {
Packit 95306a
      while ($#time < 2) {
Packit 95306a
         push(@time,0);
Packit 95306a
      }
Packit 95306a
      $date->prev($dow,$curr,\@time);
Packit 95306a
   } else {
Packit 95306a
      $date->prev($dow,$curr);
Packit 95306a
   }
Packit 95306a
   my $ret = $date->value();
Packit 95306a
   return $ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_GetNext {
Packit 95306a
   my($string,$dow,$curr,@time) = @_;
Packit 95306a
   my $err = $date->parse($string);
Packit 95306a
   return ''  if ($err);
Packit 95306a
Packit 95306a
   if (defined($dow)) {
Packit 95306a
      $dow = lc($dow);
Packit 95306a
      if      (exists $$dmb{'data'}{'wordmatch'}{'day_char'}{$dow}) {
Packit 95306a
         $dow = $$dmb{'data'}{'wordmatch'}{'day_char'}{$dow};
Packit 95306a
      } elsif (exists $$dmb{'data'}{'wordmatch'}{'day_abb'}{$dow}) {
Packit 95306a
         $dow = $$dmb{'data'}{'wordmatch'}{'day_abb'}{$dow};
Packit 95306a
      } elsif (exists $$dmb{'data'}{'wordmatch'}{'day_name'}{$dow}) {
Packit 95306a
         $dow = $$dmb{'data'}{'wordmatch'}{'day_name'}{$dow};
Packit 95306a
      }
Packit 95306a
   }
Packit 95306a
Packit 95306a
   if ($#time == 0) {
Packit 95306a
      @time = @{ $dmb->split('hms',$time[0]) };
Packit 95306a
   }
Packit 95306a
Packit 95306a
   if (@time) {
Packit 95306a
      while ($#time < 2) {
Packit 95306a
         push(@time,0);
Packit 95306a
      }
Packit 95306a
      $date->next($dow,$curr,\@time);
Packit 95306a
   } else {
Packit 95306a
      $date->next($dow,$curr);
Packit 95306a
   }
Packit 95306a
   my $ret = $date->value();
Packit 95306a
   return $ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_SetTime {
Packit 95306a
   my($string,@time) = @_;
Packit 95306a
Packit 95306a
   my $err = $date->parse($string);
Packit 95306a
   return ''  if ($err);
Packit 95306a
Packit 95306a
   if ($#time == 0) {
Packit 95306a
      @time = @{ $dmb->split('hms',$time[0]) };
Packit 95306a
   }
Packit 95306a
Packit 95306a
   while ($#time < 2) {
Packit 95306a
      push(@time,0);
Packit 95306a
   }
Packit 95306a
Packit 95306a
   $date->set('time',\@time);
Packit 95306a
   my $val = $date->value();
Packit 95306a
   return $val;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_SetDateField {
Packit 95306a
   my($string,$field,$val) = @_;
Packit 95306a
Packit 95306a
   my $err = $date->parse($string);
Packit 95306a
   return ''  if ($err);
Packit 95306a
Packit 95306a
   $date->set($field,$val);
Packit 95306a
   my $ret = $date->value();
Packit 95306a
   return $ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_NextWorkDay {
Packit 95306a
   my($string,$n,$checktime) = @_;
Packit 95306a
   my $err = $date->parse($string);
Packit 95306a
   return ''  if ($err);
Packit 95306a
   $date->next_business_day($n,$checktime);
Packit 95306a
   my $val = $date->value();
Packit 95306a
   return $val;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_PrevWorkDay {
Packit 95306a
   my($string,$n,$checktime) = @_;
Packit 95306a
   my $err = $date->parse($string);
Packit 95306a
   return ''  if ($err);
Packit 95306a
   $date->prev_business_day($n,$checktime);
Packit 95306a
   my $val = $date->value();
Packit 95306a
   return $val;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_NearestWorkDay {
Packit 95306a
   my($string,$tomorrowfirst) = @_;
Packit 95306a
   my $err = $date->parse($string);
Packit 95306a
   return ''  if ($err);
Packit 95306a
   $date->nearest_business_day($tomorrowfirst);
Packit 95306a
   my $val = $date->value();
Packit 95306a
   return $val;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub ParseRecur {
Packit 95306a
   my($string,@args) = @_;
Packit 95306a
Packit 95306a
   if ($#args == 3) {
Packit 95306a
      my($base,$d0,$d1,$flags) = @args;
Packit 95306a
      @args = ();
Packit 95306a
      push(@args,$flags)  if ($flags);
Packit 95306a
      push(@args,$base,$d0,$d1);
Packit 95306a
   }
Packit 95306a
Packit 95306a
   my $err = $recur->parse($string,@args);
Packit 95306a
   return ''  if ($err);
Packit 95306a
Packit 95306a
   if (wantarray) {
Packit 95306a
      my @dates = $recur->dates();
Packit 95306a
      my @ret;
Packit 95306a
      foreach my $d (@dates) {
Packit 95306a
         my $val = $d->value();
Packit 95306a
         push(@ret,$val);
Packit 95306a
      }
Packit 95306a
      return @ret;
Packit 95306a
   }
Packit 95306a
Packit 95306a
   my @int   = @{ $$recur{'data'}{'interval'} };
Packit 95306a
   my @rtime = @{ $$recur{'data'}{'rtime'} };
Packit 95306a
   my @flags = @{ $$recur{'data'}{'flags'} };
Packit 95306a
   my $start = $$recur{'data'}{'start'};
Packit 95306a
   my $end   = $$recur{'data'}{'end'};
Packit 95306a
   my $base  = $$recur{'data'}{'base'};
Packit 95306a
Packit 95306a
   my $r;
Packit 95306a
   if (@int) {
Packit 95306a
      $r = join(':',@int);
Packit 95306a
   }
Packit 95306a
   if (@rtime) {
Packit 95306a
      my @rt;
Packit 95306a
      foreach my $rt (@rtime) {
Packit 95306a
         push(@rt,join(",",@$rt));
Packit 95306a
      }
Packit 95306a
      $r .= '*' . join(':',@rt);
Packit 95306a
   }
Packit 95306a
Packit 95306a
   $r .= '*' . join(",",@flags);
Packit 95306a
Packit 95306a
   my $val = (defined($base) ? $base->value() : '');
Packit 95306a
   $r .= "*$val";
Packit 95306a
Packit 95306a
   $val = (defined($start) ? $start->value() : '');
Packit 95306a
   $r .= "*$val";
Packit 95306a
Packit 95306a
   $val = (defined($end) ? $end->value() : '');
Packit 95306a
   $r .= "*$val";
Packit 95306a
Packit 95306a
   return $r;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Events_List {
Packit 95306a
   my($datestr,@args) = @_;
Packit 95306a
Packit 95306a
   # First argument is always a date
Packit 95306a
Packit 95306a
   my $err = $date->parse($datestr);
Packit 95306a
   return []  if ($err);
Packit 95306a
Packit 95306a
   # Second argument is absent, a date, or 0.
Packit 95306a
Packit 95306a
   my @list;
Packit 95306a
   my $flag = 0;
Packit 95306a
   my ($date0,$date1);
Packit 95306a
Packit 95306a
   if (! @args) {
Packit 95306a
      # absent
Packit 95306a
      @list    = $date->list_events('dates');
Packit 95306a
Packit 95306a
   } else {
Packit 95306a
      # a date or 0
Packit 95306a
      my $arg  = shift(@args);
Packit 95306a
      $flag    = shift(@args)  if (@args);
Packit 95306a
      if (@args) {
Packit 95306a
         warn "ERROR: unknown argument list\n";
Packit 95306a
         return [];
Packit 95306a
      }
Packit 95306a
Packit 95306a
      if (! $arg) {
Packit 95306a
         my($y,$m,$d) = $date->value();
Packit 95306a
         $date2->set('date',[$y,$m,$d,23,59,59]);
Packit 95306a
         @list = $date->list_events(0, 'dates');
Packit 95306a
Packit 95306a
      } else {
Packit 95306a
         $err = $date2->parse($arg);
Packit 95306a
         if ($err) {
Packit 95306a
            warn "ERROR: invalid argument: $arg\n";
Packit 95306a
            return [];
Packit 95306a
         }
Packit 95306a
         @list = $date->list_events($date2, 'dates');
Packit 95306a
      }
Packit 95306a
   }
Packit 95306a
Packit 95306a
   # Handle the flag
Packit 95306a
Packit 95306a
   if (! $flag) {
Packit 95306a
      my @ret = ();
Packit 95306a
      foreach my $e (@list) {
Packit 95306a
         my($d,@n) = @$e;
Packit 95306a
         my $v = $d->value();
Packit 95306a
         push(@ret,$v,[@n]);
Packit 95306a
      }
Packit 95306a
      return \@ret;
Packit 95306a
   }
Packit 95306a
Packit 95306a
   push(@list,[$date2]);
Packit 95306a
   my %ret;
Packit 95306a
Packit 95306a
   if ($flag==1) {
Packit 95306a
      while ($#list > 0) {
Packit 95306a
         my($d0,@n) = @{ shift(@list) };
Packit 95306a
         my $d1     = $list[0]->[0];
Packit 95306a
         my $delta  = $d0->calc($d1);
Packit 95306a
Packit 95306a
         foreach $flag (@n) {
Packit 95306a
            $flag = ''  if (! defined($flag));
Packit 95306a
            if (exists $ret{$flag}) {
Packit 95306a
               $ret{$flag} = $ret{$flag}->calc($delta);
Packit 95306a
            } else {
Packit 95306a
               $ret{$flag} = $delta;
Packit 95306a
            }
Packit 95306a
         }
Packit 95306a
      }
Packit 95306a
Packit 95306a
   } elsif ($flag==2) {
Packit 95306a
      while ($#list > 0) {
Packit 95306a
         my($d0,@n) = @{ shift(@list) };
Packit 95306a
         my $d1     = $list[0]->[0];
Packit 95306a
         my $delta  = $d0->calc($d1);
Packit 95306a
         $flag      = join("+",sort(@n));
Packit 95306a
Packit 95306a
         if (exists $ret{$flag}) {
Packit 95306a
            $ret{$flag} = $ret{$flag}->calc($delta);
Packit 95306a
         } else {
Packit 95306a
            $ret{$flag} = $delta;
Packit 95306a
         }
Packit 95306a
      }
Packit 95306a
Packit 95306a
   } else {
Packit 95306a
      warn "ERROR: Invalid flag $flag\n";
Packit 95306a
      return [];
Packit 95306a
   }
Packit 95306a
Packit 95306a
   foreach my $flag (keys %ret) {
Packit 95306a
      $ret{$flag} = $ret{$flag}->value();
Packit 95306a
   }
Packit 95306a
Packit 95306a
   return \%ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
########################################################################
Packit 95306a
# ADDITIONAL ROUTINES
Packit 95306a
########################################################################
Packit 95306a
Packit 95306a
sub Date_DayOfWeek {
Packit 95306a
   my($m,$d,$y) = @_;
Packit 95306a
   return $dmb->day_of_week([$y,$m,$d]);
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_SecsSince1970 {
Packit 95306a
   my($m,$d,$y,$h,$mn,$s) = @_;
Packit 95306a
   return $dmb->secs_since_1970([$y,$m,$d,$h,$mn,$s]);
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_SecsSince1970GMT {
Packit 95306a
   my($m,$d,$y,$h,$mn,$s) = @_;
Packit 95306a
   $date->set('date',[$y,$m,$d,$h,$mn,$s]);
Packit 95306a
   return $date->secs_since_1970_GMT();
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_DaysSince1BC {
Packit 95306a
   my($m,$d,$y) = @_;
Packit 95306a
   return $dmb->days_since_1BC([$y,$m,$d]);
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_DayOfYear {
Packit 95306a
   my($m,$d,$y) = @_;
Packit 95306a
   return $dmb->day_of_year([$y,$m,$d]);
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_NthDayOfYear {
Packit 95306a
   my($y,$n) = @_;
Packit 95306a
   my @ret = @{ $dmb->day_of_year($y,$n) };
Packit 95306a
   push(@ret,0,0,0)  if ($#ret == 2);
Packit 95306a
   return @ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_DaysInMonth {
Packit 95306a
   my($m,$y) = @_;
Packit 95306a
   return $dmb->days_in_month($y,$m);
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_DaysInYear {
Packit 95306a
   my($y) = @_;
Packit 95306a
   return $dmb->days_in_year($y);
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_WeekOfYear {
Packit 95306a
   my($m,$d,$y,$first) = @_;
Packit 95306a
   my($yy,$ww) = $dmb->_week_of_year($first,[$y,$m,$d]);
Packit 95306a
   return 0   if ($yy<$y);
Packit 95306a
   return 53  if ($yy>$y);
Packit 95306a
   return $ww;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_LeapYear {
Packit 95306a
   my($y) = @_;
Packit 95306a
   return $dmb->leapyear($y);
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_DaySuffix {
Packit 95306a
   my($d) = @_;
Packit 95306a
   return $$dmb{'data'}{'wordlist'}{'nth_dom'}[$d-1];
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_TimeZone {
Packit 95306a
   my($ret) = $dmb->_now('tz');
Packit 95306a
   return $ret;
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_ConvTZ {
Packit 95306a
   my($str,$from,$to) = @_;
Packit 95306a
   $from = $dmb->_now('tz')  if (! $from);
Packit 95306a
   $to   = $dmb->_now('tz')  if (! $to);
Packit 95306a
Packit 95306a
   # Parse the date (ignoring timezone information):
Packit 95306a
Packit 95306a
   my $err = $dateUT->parse($str);
Packit 95306a
   return ''  if ($err);
Packit 95306a
   my $d   = [ $dateUT->value() ];
Packit 95306a
   return ''  if (! $d);
Packit 95306a
Packit 95306a
   # Get the timezone for $from. First, we'll assume that
Packit 95306a
   # the date matches exactly (so if the timezone is passed
Packit 95306a
   # in as an abbreviation, we'll try to get the timezone
Packit 95306a
   # that fits the date/abbrev combination). If we can't,
Packit 95306a
   # we'll just assume that the timezone is more generic
Packit 95306a
   # and try it without the date.
Packit 95306a
Packit 95306a
   my $tmp;
Packit 95306a
   $tmp = $dmt->zone($from,$d);
Packit 95306a
   if (! $tmp) {
Packit 95306a
      $tmp = $dmt->zone($from);
Packit 95306a
      return ''  if (! $tmp);
Packit 95306a
   }
Packit 95306a
   $from = $tmp;
Packit 95306a
Packit 95306a
   $tmp = $dmt->zone($to,$d);
Packit 95306a
   if (! $tmp) {
Packit 95306a
      $tmp = $dmt->zone($to);
Packit 95306a
      return ''  if (! $tmp);
Packit 95306a
   }
Packit 95306a
   $to = $tmp;
Packit 95306a
Packit 95306a
   ($err,$d) = $dmt->convert($d,$from,$to);
Packit 95306a
   return ''  if ($err);
Packit 95306a
   return $dmb->join('date',$d);
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_IsWorkDay {
Packit 95306a
   my($str,$checktime) = @_;
Packit 95306a
   my $err = $date->parse($str);
Packit 95306a
   return ''  if ($err);
Packit 95306a
   return $date->is_business_day($checktime);
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_IsHoliday {
Packit 95306a
   my($str) = @_;
Packit 95306a
   my $err = $date->parse($str);
Packit 95306a
   return undef  if ($err);
Packit 95306a
   if (wantarray) {
Packit 95306a
      my @ret = $date->holiday();
Packit 95306a
      return @ret;
Packit 95306a
   } else {
Packit 95306a
      my $ret = $date->holiday();
Packit 95306a
      return $ret;
Packit 95306a
   }
Packit 95306a
}
Packit 95306a
Packit 95306a
sub Date_Cmp {
Packit 95306a
   my($str1,$str2) = @_;
Packit 95306a
   my $err = $date->parse($str1);
Packit 95306a
   return undef  if ($err);
Packit 95306a
   $err = $date2->parse($str2);
Packit 95306a
   return undef  if ($err);
Packit 95306a
   return $date->cmp($date2);
Packit 95306a
}
Packit 95306a
Packit 95306a
1;
Packit 95306a
# Local Variables:
Packit 95306a
# mode: cperl
Packit 95306a
# indent-tabs-mode: nil
Packit 95306a
# cperl-indent-level: 3
Packit 95306a
# cperl-continued-statement-offset: 2
Packit 95306a
# cperl-continued-brace-offset: 0
Packit 95306a
# cperl-brace-offset: 0
Packit 95306a
# cperl-brace-imaginary-offset: 0
Packit 95306a
# cperl-label-offset: 0
Packit 95306a
# End: