Perl :: Aufgabe #53

3 Lösungen Lösungen öffentlich

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.

Lösungen:

vote_ok
von Gustl (6560 Punkte) - 22.07.2013 um 11:13 Uhr
Quellcode ausblenden Perl-Code
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.
vote_ok
von Gustl (6560 Punkte) - 22.07.2013 um 13:18 Uhr
Quellcode ausblenden Perl-Code
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" );
vote_ok
von Gustl (6560 Punkte) - 22.07.2013 um 14:48 Uhr
Hier noch eine Lösung von dem User Linuxer aus dem deutschsprachigen Perl-Forum, wobei DateTime mit Methoden erweitert wird.

Quellcode ausblenden 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, $/;