Perl :: Aufgabe #53
3 Lösungen

Bei Addition von Tage nur Werktage beachten
Anfänger - Perl
von Gustl
- 22.07.2013 um 11:04 Uhr
Schreibe ein Programm welches die Anzahl der addierenden Tage abfrägt und dann das Datum ausgibt.
Bei der Addition der Tage sollen aber nur die Werktage (Geschäftstage): Montag, Dienstag, Mittwoch, Donnerstag und Freitag beachtet werden.
Beispiel: Heute ist der 22.07. (Montag), wenn ich nun 7 Tage eingebe soll der 31.07. (Mittwoch) ausgegeben werden.
Bei der Addition der Tage sollen aber nur die Werktage (Geschäftstage): Montag, Dienstag, Mittwoch, Donnerstag und Freitag beachtet werden.
Beispiel: Heute ist der 22.07. (Montag), wenn ich nun 7 Tage eingebe soll der 31.07. (Mittwoch) ausgegeben werden.
Lösungen:

use strict; use POSIX; print "Wie viele Werktage sollen addiert werden (Startdatum Heute):\t"; my $days_add = <STDIN>; chomp $days_add; print "Tag (addiert mit $days_add Werktage): ".get_time( get_add_day(time, $days_add) ); sub get_add_day{ my $start_time = shift; my $adddays = shift; foreach(1..$adddays){ $start_time += 24 * 60 * 60; # addiert einen Tag while(!is_week_day($start_time)){ # wenn der Tag kein Werktag ist -> addiere einen Tag $start_time += 24 * 60 * 60; } } return $start_time; } sub is_week_day{ my $time = shift; my $Wochentag = (localtime($time))[6]; # liest den wochentag aus 0 ist Sonntag 6 ist Samstag if($Wochentag == 0 || $Wochentag == 6){ return 0; } return 1; } sub get_time{ return strftime "%d.%m.%Y", localtime(shift); }
Bei dieser Lösung ist die Sommerzeit, Winterzeit sowie die Schaltjahre nicht berücksichtigt.

use strict; use DateTime; use POSIX; my $SAMSTAG = 6; my $SONNTAG = 7; print "Wie viele Werktage sollen addiert werden (Startdatum Heute):\t"; my $add_Geschaeftstage = <STDIN>; chomp $add_Geschaeftstage; my $dt = DateTime->now( time_zone => 'Europe/Berlin' ); while ($add_Geschaeftstage) { $dt->add( days => 1 ); $add_Geschaeftstage-- unless ( $dt->wday() == $SAMSTAG || $dt->wday() == $SONNTAG ); } print "Tag ohne Wochenendtage: ".$dt->strftime( "%d.%m.%Y" );
Hier noch eine Lösung von dem User Linuxer aus dem deutschsprachigen Perl-Forum, wobei DateTime mit Methoden erweitert wird.
Perl-Code

#! /usr/bin/perl use strict; use warnings; use DateTime; # Quick-Hacked: extend DateTime to set/check for business days { # default setting: 1-5 (Mo-Fr) are business days my %business_days; @business_days{1..5} = (1)x5; # Method to define business days sub DateTime::set_business_days { my $self = shift; %business_days = (); $business_days{$_} = 1 for @_; } # Method if given wday is a business day sub DateTime::is_business_day { my $self = shift; my $wday = $self->wday; return 1 if $business_days{$wday}; return 0; } } my $day1 = DateTime->now( time_zone => 'Europe/Berlin' ); $day1->set_business_days( 1 .. 5 ); print "Wie viele Werktage sollen addiert werden (Startdatum Heute):\t"; my $add = <STDIN>; chomp $add; while ( $add ) { $day1->add( days => 1 ); my $wday = $day1->wday; $add-- if $day1->is_business_day; } print $day1->ymd, $/;