248 lines
6.1 KiB
Perl
248 lines
6.1 KiB
Perl
package datum;
|
|
require Exporter;
|
|
|
|
use Date::Calc qw/Add_Delta_Days Day_of_Week/;
|
|
|
|
use vars qw($VERSION @ISA @EXPORT);
|
|
$VERSION = 1.00;
|
|
@ISA = qw(Exporter);
|
|
###############################################################################
|
|
@EXPORT = qw/
|
|
find_day
|
|
work_day
|
|
trade_day
|
|
business_day
|
|
|
|
/;
|
|
|
|
our $MOD_YY; # Jahr 2 stellig
|
|
our $MOD_YYYY; # Jahr 4 stellig
|
|
our $MOD_MM; # Monat
|
|
our $MOD_DD; # Tag
|
|
our $MOD_HH; # Stunde 24
|
|
our $MOD_hh; # Stunde 12
|
|
our $MOD_APM; # a.m. oder p.m.
|
|
our $MOD_mm; # Minute
|
|
our $MOD_ss; # Sekunde
|
|
our $MOD_DST; # Daylight Saving Time
|
|
|
|
######## Datum Funktionen und Beispielnutzung
|
|
#my $s = "%04s-%02s-%02s %02s(%s %s):%02s:%02s %s";
|
|
#my $v = "YYYY,MM,DD,HH,hh,AP,mm,ss,DST";
|
|
#my $o = 0;
|
|
#my $d = find_day($o, "$s", "$v");
|
|
#printf "Offset %3s, Format \"%s\", \"%s\" => %s\n", $o, $s, $v, $d;
|
|
#$s = "%02s-%02s-%04s";
|
|
#$v = "DD,MM, YYYY";
|
|
#$o = -5;
|
|
#$d = find_day($o+6, "$s", "$v");
|
|
#printf "Offset %3s, Format \"%s\", \"%s\" => %s\n", $o, $s, $v, $d;
|
|
#$s = "%s";
|
|
#$v = "DST";
|
|
#$o = 0;
|
|
#$d = find_day($o, "$s", "$v");
|
|
#printf "Keine " if ($d == 0);
|
|
#print "Sommerzeit\n";
|
|
|
|
#our @bu = qw /25.12.2013 27.12.2013/;
|
|
#$d = business_day(0, \@bu, "", "");
|
|
#print "Kein " if !$d;
|
|
#print "Arbeitstag\n";
|
|
|
|
#our @bu = qw /25.12.2013 27.12.2013/;
|
|
#$s = "%02s-%02s-%04s";
|
|
#$v = "DD,MM,YYYY";
|
|
#$o = -4;
|
|
#$d = business_day($o, \@bu, "$s", "$v");
|
|
#printf "Offset %3s, Format \"%s\", \"%s\" => %s\n", $o, $s, $v, $d;
|
|
|
|
# Datum in den Formaten zulässig
|
|
# DD.MM.YYYY DD.MM.YY->DD.MM.20YY DD.MM DD.MM.
|
|
our @work = qw /24.12.13 25.12 26.12. 31.12. 01.01/;
|
|
our @trade = qw / 25.12 26.12. 01.01/;
|
|
|
|
sub find_day {
|
|
my $o=shift; # Offset .... -1 gestern, 0: heute, 1 morgen ....
|
|
my $f=shift; # "%04s-%02s-%02s"
|
|
my $s=shift; # "YY,MM,DD";
|
|
|
|
calc_var();
|
|
#offset berechnen
|
|
($MOD_YYYY,$MOD_MM,$MOD_DD) = Add_Delta_Days($MOD_YYYY,$MOD_MM,$MOD_DD,$o);
|
|
$MOD_YY= $MOD_YYYY % 100;
|
|
|
|
my @s=replace_var($s);
|
|
my $ret=sprintf($f, @s);
|
|
return $ret;
|
|
}
|
|
|
|
sub work_day {
|
|
my $o=shift; # Offset .... -1 gestern, 0: heute, 1 morgen ...., Ist Offset 0: liefert Funktion 1 für Arbeitstag und 0 für keinen Arbeitstag
|
|
my $f=shift; # "%04s-%02s-%02s"
|
|
my $s=shift; #
|
|
calc_var();
|
|
|
|
if ($o == 0) {
|
|
if (is_work_day($MOD_YYYY,$MOD_MM,$MOD_DD)) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
my $oa = abs($o);
|
|
my $i = 1;
|
|
$i = -1 if ($o < 0);
|
|
|
|
for my $j (1 .. $oa) {
|
|
do {
|
|
($MOD_YYYY,$MOD_MM,$MOD_DD) = Add_Delta_Days($MOD_YYYY,$MOD_MM,$MOD_DD,$i);
|
|
} while (!is_work_day($MOD_YYYY,$MOD_MM,$MOD_DD));
|
|
}
|
|
my @s=replace_var($s);
|
|
$ret=sprintf($f,@s);
|
|
return $ret;
|
|
}
|
|
|
|
sub trade_day {
|
|
my $o=shift; # Offset .... -1 gestern, 0: heute, 1 morgen ...., Ist Offset 0: liefert Funktion 1 für Arbeitstag und 0 für keinen Arbeitstag
|
|
my $f=shift; # "%04s-%02s-%02s"
|
|
my $s=shift; #
|
|
calc_var();
|
|
|
|
if ($o == 0) {
|
|
if (is_trade_day($MOD_YYYY,$MOD_MM,$MOD_DD)) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
my $oa = abs($o);
|
|
my $i = 1;
|
|
$i = -1 if ($o < 0);
|
|
|
|
for my $j (1 .. $oa) {
|
|
do {
|
|
($MOD_YYYY,$MOD_MM,$MOD_DD) = Add_Delta_Days($MOD_YYYY,$MOD_MM,$MOD_DD,$i);
|
|
} while (!is_trade_day($MOD_YYYY,$MOD_MM,$MOD_DD));
|
|
}
|
|
my @s=replace_var($s);
|
|
$ret=sprintf($f,@s);
|
|
return $ret;
|
|
}
|
|
|
|
sub business_day {
|
|
my $o=shift; # Offset .... -1 gestern, 0: heute, 1 morgen ...., Ist Offset 0: liefert Funktion 1 für Arbeitstag und 0 für keinen Arbeitstag
|
|
my $k=shift; # Array Ref, Array enthält Feiertage
|
|
my @k=@{$k};
|
|
my $f=shift; # "%04s-%02s-%02s"
|
|
my $s=shift; #
|
|
calc_var();
|
|
|
|
if ($o == 0) {
|
|
if (is_business_day(\@k,$MOD_YYYY,$MOD_MM,$MOD_DD)) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
my $oa = abs($o);
|
|
my $i = 1;
|
|
$i = -1 if ($o < 0);
|
|
|
|
for my $j (1 .. $oa) {
|
|
do {
|
|
($MOD_YYYY,$MOD_MM,$MOD_DD) = Add_Delta_Days($MOD_YYYY,$MOD_MM,$MOD_DD,$i);
|
|
} while (!is_business_day(\@k,$MOD_YYYY,$MOD_MM,$MOD_DD));
|
|
}
|
|
my @s=replace_var($s);
|
|
$ret=sprintf($f,@s);
|
|
return $ret;
|
|
}
|
|
|
|
sub calc_var {
|
|
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); #1388148859); # Freitag 27.12.2013 13:54 Uhr 19s
|
|
$MOD_YYYY = $year + 1900;
|
|
$MOD_YY = $year % 100;
|
|
$MOD_MM = $mon + 1;
|
|
$MOD_DD = $mday;
|
|
$MOD_HH = $hour;
|
|
$MOD_hh = $hour;
|
|
$MOD_hh -= 12 if ($MOD_hh > 12);
|
|
$MOD_mm = $min;
|
|
$MOD_ss = $sec;
|
|
$MOD_APM = 'a.m.';
|
|
$MOD_APM = 'p.m.' if ($MOD_HH >= 12);
|
|
$MOD_DST = $isdst;
|
|
$MOD_WD = $wday;
|
|
}
|
|
|
|
sub replace_var {
|
|
my $s=shift;
|
|
$s =~ s/\s//g;
|
|
$s =~ s/YYYY/$MOD_YYYY/g;
|
|
$s =~ s/YY/$MOD_YY/g;
|
|
$s =~ s/MM/$MOD_MM/g;
|
|
$s =~ s/DD/$MOD_DD/g;
|
|
$s =~ s/HH/$MOD_HH/g;
|
|
$s =~ s/hh/$MOD_hh/g;
|
|
$s =~ s/mm/$MOD_mm/g;
|
|
$s =~ s/ss/$MOD_ss/g;
|
|
$s =~ s/AP/$MOD_APM/g;
|
|
$s =~ s/DST/$MOD_DST/g;
|
|
my @s=split /,/,$s;
|
|
return @s;
|
|
}
|
|
|
|
sub is_work_day {
|
|
my $y=shift;
|
|
my $m=shift;
|
|
my $d=shift;
|
|
my $dow = Day_of_Week($y,$m,$d);
|
|
my $is=1;
|
|
$is=0 if ($dow > 5); # Samstag (6) oder Sonntag (7)
|
|
foreach (@work) {
|
|
my $a=sprintf("%02s.%02s.%04s", $d,$m,$y);
|
|
$is=0 if ($_ eq $a);
|
|
}
|
|
return $is;
|
|
}
|
|
|
|
sub is_trade_day {
|
|
my $y=shift;
|
|
my $m=shift;
|
|
my $d=shift;
|
|
my $dow = Day_of_Week($y,$m,$d);
|
|
my $is=1;
|
|
$is=0 if ($dow > 5); # Samstag (6) oder Sonntag (7)
|
|
foreach (@trade) {
|
|
my $a=sprintf("%02s.%02s.%04s", $d,$m,$y);
|
|
$is=0 if ($_ eq $a);
|
|
}
|
|
return $is;
|
|
}
|
|
|
|
sub is_business_day {
|
|
my $k=shift;
|
|
my @k=@{$k};
|
|
my $y=shift;
|
|
my $m=shift;
|
|
my $d=shift;
|
|
my $dow = Day_of_Week($y,$m,$d);
|
|
my $is=1;
|
|
$is=0 if ($dow > 5); # Samstag (6) oder Sonntag (7)
|
|
foreach my $dat (@k) {
|
|
my $a=sprintf("%02s.%02s.%04s", $d,$m,$y);
|
|
# wenn datum im array ($_) kein jahr beinhaltet, akteuelles Jahr nutzen
|
|
if ($dat =~ /^([0-9]{2})\.([0-9]{2})\.([0-9]{2})$/) {
|
|
$dat = $1.".".$2."."."20".$3;
|
|
}
|
|
$dat .= ".$MOD_YYYY" if ($dat =~ /^[0-9]{2}\.[0-9]{2}$/);
|
|
$dat .= "$MOD_YYYY" if ($dat =~ /^[0-9]{2}\.[0-9]{2}\.$/);
|
|
$is=0 if ($dat eq $a);
|
|
}
|
|
return $is;
|
|
}
|
|
|
|
1;
|
|
|