Thread Addition von Geschäftstagen (25 answers)
Opened by tejste at 2013-07-22 10:17

Linuxer
 2013-07-22 20:33
#169013 #169013
User since
2006-01-27
3882 articles
HausmeisterIn

user image
Die set_business_days() wird aufgerufen, um die Geschäftstage zu setzen. In diesem Fall ist der Aufruf nicht wirklich notwendig, weil der Hash %business_days bereits mit den gleichen Werten schon vorbelegt ist.
Aber der Aufruf sollte eher aufzeigen, wie man die Geschäftstage (neu) definieren/festlegen kann.

Da mein Gedanke war, dass ganze als Methoden von DateTime zu implementieren, beginnen die beiden Methoden eben mit my $self = shift;. Auch wenn $self nicht verwendet wird, würde ich das so stehen lassen. Aus zwei Gründen:
1. Beim Methodenaufruf wird das Objekt, für das die Methode aufgerufen wird, als erstes Argument übergeben. Durch die Zeile ist das erste Argument abgearbeitet und aus der Argumentliste entfernt und man kann sich den restlichen Argumenten zuwenden.
2. Sollte die Methode später mal überarbeitet werden, ist das $self schon deklariert und definiert...

Die Reihenfolge der Aufrufe resultiert daraus, dass ich erstmal ein neues DateTime-Objekt erzeuge, für das ich dann die Methoden aufrufen will. Mein erster Ansatz sah vor, dass ich die Geschäftstage pro erzeugten DateTime-Objekt definieren wollte.
Also erst das Objekt mit DateTime->now( ... ) erzeugen und dann die Geschäftstage definieren.

Da aber mein erster Versuch, die Daten ins DateTime-Objekt selber zu legen, fehlschlug, ist das nicht mehr ganz so klar und deutlich.
Sorry. Also könnte man das auch einfach vom DateTime lösen; vielleicht wird es damit klarer?

Die Funktionen sind im folgenden Beispiel von DateTime losgelöst; dafür muss das Ergebnis von $day1->wday nun als Argument an is_business_day() übergeben werden.

Code (perl): (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
#! /usr/bin/perl
use strict;
use warnings;
use DateTime;


# functions to set/check for business days
{
  # set defaults; 1-5 (Mo-Fr) are business days
  # see: http://search.cpan.org/perldoc?DateTime#$dt-%3Eday_of_week()
  # for information which number is which day of week
  my %business_day;
  @business_day{1..5} = (1)x5;

  # function to (re)set business days
  sub set_business_days {
    %business_day     = ();
    $business_day($_} = 1    for @_;
  }

  # check if given day of week is a business day
  sub is_business_day {
    my $wday = shift;
    return 1    if $business_day{$wday};
    return 0;
  }
}

# or  1..3 for a shorter week; using 1..5 here is redundant, as they are already predefined
set_business_days( 1..5 );  



my $day1 = DateTime->now( time_zone => 'Europe/Berlin' );

my $add = 7;

while ( $add ) {
        $day1->add( days => 1 );
        $add--  if is_business_day( $day1->wday );
}

print $day1->ymd, $/;

Last edited: 2013-07-22 20:35:09 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Addition von Geschäftstagen