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;