This commit is contained in:
2024-10-14 00:08:40 +02:00
parent dbfba56f66
commit 1462d52e13
4572 changed files with 2658864 additions and 0 deletions

View File

@@ -0,0 +1,247 @@
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;