Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7777[/thread]

Werktage eines Jahres ermitteln: Datum & Wochentag jedes Werktags

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
pearl-man
 2006-03-09 11:51
#63659 #63659
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
Möchte zunächst jeden Werktag eines bestimmten Jahres ermitteln (z.B. 2004), also alle regulären Arbeitstage (alle Werktage bazüglich Feiertage und freiwählbare Urlaubstage). Die Tage sollen in Form eines gültigen Datums und des Wochentags zur Verfügung stehen. Wie kann ich automatisiert all diese Tage in einen Hash/Array schreiben und der Reihe nach mit einer Methode bearbeiten?

gibts n cpan-Mod?

mfg
renee
 2006-03-09 12:01
#63660 #63660
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Im Prinzip kann man mit CPAN:Date::Calc arbeiten. Aber eigentlich ist ja jeder Tag ein Werktag, abhängig von der Berufsgruppe und des Unternehmens!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
nepos
 2006-03-09 12:40
#63661 #63661
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Viel Spass, wenn du Feiertage beruecksichtigen moechtest, da musst dann naemlich auf die verschiedenen Bundeslaender Ruecksicht nehmen und solche Spaesse...
pearl-man
 2006-03-09 12:56
#63662 #63662
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
Hab das ganze jetzt so realisiert (noch ohne Abzug von Feiertagen/Urlaub):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/perl -w

use strict;
use Date::Handler;

my $start_year = 2004;
my $start_month = 9;
my $start_day = 1;
my $end_year = 2006;
my $end_month = 9;
my $end_day = 1;
my $date;

my ($week_day, $year, $month, $day, $max_month, $max_day, $min_month);
my @work_days = ();

for $year ($start_year .. $end_year){
       if ( ($year eq $start_year) ){
               $min_month = $start_month;
       } else {
               $min_month = 1;
       }
       if ( ($year eq $end_year) ){
               $max_month = $end_month;
       } else {
               $max_month = 12;
       }
       for $month ($min_month .. $max_month){
               $date = new Date::Handler({ date => { year => $year, month => $month, day => 0 },});
               if ( ($year eq $end_year) && ($month eq $end_month) ){
                       $max_day = $end_day;
               } else {
                       $max_day = $date->DaysInMonth();
               }
for $day ($start_day .. $max_day){
                       $date = new Date::Handler({ date => { year => $start_year, month => $month, day => $day },});
                       $week_day = $date->WeekDayName();
                       push(@work_days, $week_day.';;'.$day.';;'.$month.';;'.$year) unless ( ($week_day eq 'Saturday') || ($week_day eq 'Sunday') );
               }
       }
}

my @dump= ();
foreach my $work_day (@work_days) {
        @dump = split(';;', $work_day);
       print "$dump[0]\t$dump[1].$dump[2].$dump[3]\n";
}


funzt!
pearl-man
 2006-03-09 13:05
#63663 #63663
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
sorry, noch ne verbesserung:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
...
for $year ($start_year .. $end_year){
if ( ($year eq $start_year) ){
$min_month = $start_month;
} else {
$min_month = 1;
}
if ( ($year eq $end_year) ){
$max_month = $end_month;
} else {
$max_month = 12;
}
for $month ($min_month .. $max_month){
$date = new Date::Handler({ date => { year => $year, month => $month, day => 0 },});
if ( ($year eq $start_year) && ($month eq $start_month) ){
$min_day = $start_day;
} else {
$min_day = 1;
}
if ( ($year eq $end_year) && ($month eq $end_month) ){
$max_day = $end_day;
} else {
$max_day = ($date->DaysInMonth());
}
for $day ($start_day .. $max_day){
$date = new Date::Handler({ date => { year => $start_year, month => $month, day => $day },});
$week_day = $date->WeekDayName();
push(@work_days, $week_day.';;'.$day.';;'.$month.';;'.$year) unless ( ($week_day eq 'Saturday') || ($week_day eq 'Sunday') );
}
}
}
...


Nur stimmen die Wochentage noch nicht so Recht? Jemand n Tipp?
pearl-man
 2006-03-09 13:55
#63664 #63664
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
jetzt aber:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/perl -w

use strict;
use Date::Handler;

my $start_year = 2004;
my $start_month = 9;
my $start_day = 1;
my $end_year = 2006;
my $end_month = 9;
my $end_day = 1;


sub get_workdays()
{

my ($week_day, $year, $month, $day, $max_month, $max_day, $min_month, $min_day, $string);
my @work_days = ();
my $date;

for $year ($start_year .. $end_year){
if ( ($year eq $start_year) ){
$min_month = $start_month;
} else {
$min_month = 1;
}
if ( ($year eq $end_year) ){
$max_month = $end_month;
} else {
$max_month = 12;
}
for $month ($min_month .. $max_month){
$date = new Date::Handler({ date => { year => $year, month => $month, day => 0 },});
if ( ($year eq $start_year) && ($month eq $start_month) ){
$min_day = $start_day;
} else {
$min_day = 1;
}
if ( ($year eq $end_year) && ($month eq $end_month) ){
$max_day = $end_day;
} else {
$max_day = ($date->DaysInMonth());
}
for $day ($start_day .. $max_day){
$date = new Date::Handler({ date => { year => $year, month => $month, day => $day },});
$week_day = $date->WeekDayName();
if (&feiertage_bayern($day, $month)){

$string = $week_day.';;'.$day.';;'.$month.';;'.$year.';;'.&feiertage_bayern($day, $month);
} else {

$string = $week_day.';;'.$day.';;'.$month.';;'.$year;
}
push(@work_days, $string) unless ( ($week_day eq 'Saturday') || ($week_day eq 'Sunday') );
}
}
}
return @work_days;
}



sub feiertage_bayern # ($_[0] = $day, $_[1] = $month)
{
my %feiertage=();

# Byerische Feiertage (yearly)
$feiertage{'1.1'}='Neujahr';
$feiertage{'1.5'}='Erster Mai';
$feiertage{'24.12'}='Heilig Abend';

return $feiertage{$_[0].'.'.$_[1]} if ( ($feiertage{$_[0].'.'.$_[1]}) );
return 0;
}


my @dump= ();
my @work_days = &get_workdays();
foreach my $work_day (@work_days) {
@dump = split(';;', $work_day);
if ($dump[4]){
print "$dump[0]\t$dump[1].$dump[2].$dump[3]\tFeiertag: $dump[4]\n";
} else {
print "$dump[0]\t$dump[1].$dump[2].$dump[3]\n";
}
}
renee
 2006-03-09 14:44
#63665 #63665
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Vielleicht mal CPAN:Date::Holidays::DE anschauen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
nepos
 2006-03-09 19:27
#63666 #63666
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wow, das is mal gut zu wissen :)
esskar
 2006-03-10 18:39
#63667 #63667
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
pq
 2006-03-13 13:01
#63668 #63668
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=esskar,10.03.2006, 17:39]http://feiertage-weltweit.com/[/quote]
lol:
Quote
Warning: Failed opening '../connection_data.php3' for inclusion (include_path='.:/usr/share/pear') in /home/jf_jumez/jours-feries.com/html/index.php3 on line 5

Fatal error: Call to undefined function: connection() in /home/jf_jumez/jours-feries.com/html/index.php3 on line 7
\n\n

<!--EDIT|pq|1142247860-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-03-09 11:51.