Arbeitstage berechnen

Lesezeit: 6 Minuten

Arbeitstage berechnen
AdamTheHutt

Ich brauche eine Methode zum Hinzufügen von “Werktagen” in PHP. Beispiel: Freitag, 5.12. + 3 Werktage = Mittwoch, 10.12.

Zumindest brauche ich den Code, um Wochenenden zu verstehen, aber idealerweise sollte er auch US-Bundesfeiertage berücksichtigen. Ich bin mir sicher, dass ich bei Bedarf eine Lösung mit roher Gewalt finden könnte, aber ich hoffe, dass es da draußen einen eleganteren Ansatz gibt. Jeder?

Danke.

  • Dafür habe ich eine anständige Bibliothek erstellt. github.com/andrejsstepanovs/business-days-calculator Es ist stabil und bereit, in die Produktion zu gehen.

    – Wurmstich

    6. Januar 2015 um 10:59 Uhr

  • Oh, ich denke, wir sollten erwähnen, dass wir heutzutage die Funktion DateTime::modify verwenden können, um Wochentage sofort hinzuzufügen: $my_date = new \DateTime(); $my_date->modify(“+ 7 Wochentag”); wird einfach nahtlos funktionieren.

    – Micha

    9. April 2015 um 11:04 Uhr

  • Ein ausführlicher Blog: goo.gl/YOsfPX

    – Suresh Kamrushi

    14. Januar 2016 um 8:51 Uhr

  • Eine einfachere/sauberere Antwort: stackoverflow.com/questions/5532002/…

    – David

    13. Januar 2018 um 17:29 Uhr


Holen Sie sich die Nummer von Arbeitstage ohne Feiertage zwischen zwei Terminen:

Anwendungsbeispiel:

echo number_of_working_days('2013-12-23', '2013-12-29');

Ausgabe:

3

Funktion:

function number_of_working_days($from, $to) {
    $workingDays = [1, 2, 3, 4, 5]; # date format = N (1 = Monday, ...)
    $holidayDays = ['*-12-25', '*-01-01', '2013-12-23']; # variable and fixed holidays

    $from = new DateTime($from);
    $to = new DateTime($to);
    $to->modify('+1 day');
    $interval = new DateInterval('P1D');
    $periods = new DatePeriod($from, $interval, $to);

    $days = 0;
    foreach ($periods as $period) {
        if (!in_array($period->format('N'), $workingDays)) continue;
        if (in_array($period->format('Y-m-d'), $holidayDays)) continue;
        if (in_array($period->format('*-m-d'), $holidayDays)) continue;
        $days++;
    }
    return $days;
}

  • Ich habe positiv gestimmt, weil es funktioniert und einige großartige Verbesserungen hat 🙂 Aber Sie sollten wirklich zumindest @Suresh Kamrushi erwähnen, der den größten Teil dieses Codes einen Monat zuvor gepostet hat. 🙂

    – KOGI

    20. Januar 2015 um 20:37 Uhr

  • Wenn Arbeitstage immer Montag bis Freitag sind, können Sie das Array DateInterval und workingdays ersetzen $interval = DateInterval::createFromFormat('1 weekday'); Ich empfehle auch die Verwendung $holidays = array_flip($holidays); vor dem foreach und if isset($holidays[$period->format('Y-m-d')]); um die pro Iteration benötigte Verarbeitungszeit zu verringern. Empfehlen Sie jedoch, eine benutzerdefinierte Funktion für Feiertage zu erstellen, um relative Feiertage wie Thanksgiving verarbeiten zu können last thursday of november oder Tag der Arbeit first monday of september

    – Wird B.

    25. Februar 2015 um 21:09 Uhr


  • Kann dies erweitert werden, um den Karfreitag einzuschließen (an den ich mich zu erinnern scheine, ist der Freitag vor dem ersten Sonntag nach dem ersten Vollmond nach dem 21. März)?

    – Damian Yerrick

    21. Juli 2015 um 16:45 Uhr

  • Achten Sie auf unterschiedliche Zeitzonen. Hier mit Europa/Berlin wird das nicht funktionieren. Ich mache es jetzt einfach auf dem Zeitstempel mit Datum (‘N’) und füge 1 Tag und seine Zeitzonenunabhängig hinzu.

    – Benutzer3655829

    10. Juli 2019 um 10:38 Uhr

Arbeitstage berechnen
Jakob Nudeln

Die Urlaubsberechnung ist in jedem Staat nicht standardisiert. Ich schreibe eine Bankanwendung, für die ich einige harte Geschäftsregeln benötige, kann aber immer noch nur einen groben Standard bekommen.

/**
 * National American Holidays
 * @param string $year
 * @return array
 */
public static function getNationalAmericanHolidays($year) {


    //  January 1 - New Year’s Day (Observed)
    //  Calc Last Monday in May - Memorial Day  strtotime("last Monday of May 2011");
    //  July 4 Independence Day
    //  First monday in september - Labor Day strtotime("first Monday of September 2011")
    //  November 11 - Veterans’ Day (Observed)
    //  Fourth Thursday in November Thanksgiving strtotime("fourth Thursday of November 2011");
    //  December 25 - Christmas Day        
    $bankHolidays = array(
          $year . "-01-01" // New Years
        , "". date("Y-m-d",strtotime("last Monday of May " . $year) ) // Memorial Day
        , $year . "-07-04" // Independence Day (corrected)
        , "". date("Y-m-d",strtotime("first Monday of September " . $year) ) // Labor Day
        , $year . "-11-11" // Veterans Day
        , "". date("Y-m-d",strtotime("fourth Thursday of November " . $year) ) // Thanksgiving
        , $year . "-12-25" // XMAS
        );

    return $bankHolidays;
}

  • Unabhängigkeit Tag ist $year.’-07-04′ (4. Juli), nicht der 4. Juni

    – Solepixel

    22. April 2013 um 19:13 Uhr

  • Feiertage, die auf Wochenenden fallen, werden am Tag davor (bei Samstag) oder am Tag danach (bei Sonntag) begangen. Ich konnte Ihr Array verwenden, um die tatsächlich beobachteten Tage zu erhalten. Danke.

    – BrookeAH

    30. November 2017 um 16:20 Uhr

1646907847 843 Arbeitstage berechnen
Suresh Kamrushi

$startDate = new DateTime( '2013-04-01' );    //intialize start date
$endDate = new DateTime( '2013-04-30' );    //initialize end date
$holiday = array('2013-04-11','2013-04-25');  //this is assumed list of holiday
$interval = new DateInterval('P1D');    // set the interval as 1 day
$daterange = new DatePeriod($startDate, $interval ,$endDate);
foreach($daterange as $date){
if($date->format("N") <6 AND !in_array($date->format("Y-m-d"),$holiday))
$result[] = $date->format("Y-m-d");
}
echo "<pre>";print_r($result);

  • Unabhängigkeit Tag ist $year.’-07-04′ (4. Juli), nicht der 4. Juni

    – Solepixel

    22. April 2013 um 19:13 Uhr

  • Feiertage, die auf Wochenenden fallen, werden am Tag davor (bei Samstag) oder am Tag danach (bei Sonntag) begangen. Ich konnte Ihr Array verwenden, um die tatsächlich beobachteten Tage zu erhalten. Danke.

    – BrookeAH

    30. November 2017 um 16:20 Uhr

Hier ist eine Funktion zum Hinzufügen von Geschäftstagen zu einem Datum

 function add_business_days($startdate,$buisnessdays,$holidays,$dateformat){
  $i=1;
  $dayx = strtotime($startdate);
  while($i < $buisnessdays){
   $day = date('N',$dayx);
   $date = date('Y-m-d',$dayx);
   if($day < 6 && !in_array($date,$holidays))$i++;
   $dayx = strtotime($date.' +1 day');
  }
  return date($dateformat,$dayx);
 }

 //Example
 date_default_timezone_set('Europe\London');
 $startdate="2012-01-08";
 $holidays=array("2012-01-10");
 echo '<p>Start date: '.date('r',strtotime( $startdate));
 echo '<p>'.add_business_days($startdate,7,$holidays,'r');

Ein anderer Beitrag erwähnt getWorkingDays (aus php.net-Kommentaren und hier enthalten), aber ich denke, es bricht zusammen, wenn Sie an einem Sonntag beginnen und an einem Arbeitstag enden.

Verwenden Sie Folgendes (Sie müssen die getWorkingDays-Funktion aus dem vorherigen Beitrag einfügen)

 date_default_timezone_set('Europe\London');
 //Example:
 $holidays = array('2012-01-10');
 $startDate="2012-01-08";
 $endDate="2012-01-13";
 echo getWorkingDays( $startDate,$endDate,$holidays);

Gibt das Ergebnis als 5 und nicht als 4 aus

Sun, 08 Jan 2012 00:00:00 +0000 weekend
Mon, 09 Jan 2012 00:00:00 +0000
Tue, 10 Jan 2012 00:00:00 +0000 holiday
Wed, 11 Jan 2012 00:00:00 +0000
Thu, 12 Jan 2012 00:00:00 +0000
Fri, 13 Jan 2012 00:00:00 +0000 

Die folgende Funktion wurde verwendet, um das obige zu erzeugen.

     function get_working_days($startDate,$endDate,$holidays){
      $debug = true;
      $work = 0;
      $nowork = 0;
      $dayx = strtotime($startDate);
      $endx = strtotime($endDate);
      if($debug){
       echo '<h1>get_working_days</h1>';
       echo 'startDate: '.date('r',strtotime( $startDate)).'<br>';
       echo 'endDate: '.date('r',strtotime( $endDate)).'<br>';
       var_dump($holidays);
       echo '<p>Go to work...';
      }
      while($dayx <= $endx){
       $day = date('N',$dayx);
       $date = date('Y-m-d',$dayx);
       if($debug)echo '<br />'.date('r',$dayx).' ';
       if($day > 5 || in_array($date,$holidays)){
        $nowork++;
     if($debug){
      if($day > 5)echo 'weekend';
      else echo 'holiday';
     }
       } else $work++;
       $dayx = strtotime($date.' +1 day');
      }
      if($debug){
      echo '<p>No work: '.$nowork.'<br>';
      echo 'Work: '.$work.'<br>';
      echo 'Work + no work: '.($nowork+$work).'<br>';
      echo 'All seconds / seconds in a day: '.floatval(strtotime($endDate)-strtotime($startDate))/floatval(24*60*60);
      }
      return $work;
     }

    date_default_timezone_set('Europe\London');
     //Example:
     $holidays=array("2012-01-10");
     $startDate="2012-01-08";
     $endDate="2012-01-13";
//broken
     echo getWorkingDays( $startDate,$endDate,$holidays);
//works
     echo get_working_days( $startDate,$endDate,$holidays);

Her mit den Feiertagen…

987530cookie-checkArbeitstage berechnen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy