Ich benötige eine Methode zum Hinzufügen von "Werktagen" in PHP. Zum Beispiel Freitag, 05.12. + 3 Werktage = Mittwoch, 10.12.
Zumindest brauche ich den Code, um Wochenenden zu verstehen, aber im Idealfall sollte er auch US-Bundesfeiertage berücksichtigen. Ich bin mir sicher, dass ich bei Bedarf mit brutaler Gewalt eine Lösung finden könnte, aber ich hoffe, dass es da draußen einen eleganteren Ansatz gibt. Jemand?
Vielen Dank.
Antworten:
Hier ist eine Funktion aus den Benutzerkommentaren auf der Funktionsseite von date () im PHP-Handbuch. Es ist eine Verbesserung einer früheren Funktion in den Kommentaren, die Unterstützung für Schaltjahre bietet.
Geben Sie das Start- und Enddatum sowie eine Reihe von Feiertagen ein, die möglicherweise dazwischen liegen, und geben Sie die Arbeitstage als Ganzzahl zurück:
quelle
Ermitteln Sie die Anzahl der Arbeitstage ohne Feiertage zwischen zwei Daten:
Anwendungsbeispiel:
Ausgabe:
Funktion:
quelle
$interval = DateInterval::createFromFormat('1 weekday');
Ich empfehle außerdem, es$holidays = array_flip($holidays);
vor dem foreach zu verwenden undif isset($holidays[$period->format('Y-m-d')]);
die pro Iteration erforderliche Verarbeitungszeit zu verringern . Aber empfehlen Sie, eine benutzerdefinierte Funktion für Feiertage zu erstellen, um relative Feiertage wie Erntedankfestlast thursday of november
oder Arbeitstag verarbeiten zu könnenfirst monday of september
Es gibt einige Argumente für die Funktion date () , die helfen sollten. Wenn Sie das Datum ("w") überprüfen, erhalten Sie eine Nummer für den Wochentag, von 0 für Sonntag bis 6 für Samstag. Also .. vielleicht so etwas wie ..
Dies ist nur ein grobes Beispiel für eine Möglichkeit.
quelle
Die Urlaubsberechnung ist in jedem Bundesstaat nicht Standard. Ich schreibe einen Bankantrag, für den ich einige strenge Geschäftsregeln benötige, der aber immer noch nur einen groben Standard haben kann.
quelle
quelle
Hier ist eine Funktion zum Hinzufügen von Geschäftstagen zu einem Datum
In einem anderen Beitrag wird getWorkingDays erwähnt (aus den Kommentaren von php.net und hier enthalten), aber ich denke, es bricht ab, wenn Sie an einem Sonntag beginnen und an einem Arbeitstag enden.
Verwenden Sie Folgendes (Sie müssen die Funktion getWorkingDays aus dem vorherigen Beitrag einschließen).
Gibt das Ergebnis als 5 statt 4 an
Die folgende Funktion wurde verwendet, um das Obige zu erzeugen.
Bring die Feiertage mit ...
quelle
Sie können diese Funktion ausprobieren, die einfacher ist.
quelle
Eine Funktion zum Hinzufügen oder Subtrahieren von Werktagen zu einem bestimmten Datum, die keine Feiertage berücksichtigt.
benutze so ...
quelle
Meine Version basierend auf der Arbeit von @mcgrailm ... wurde optimiert, da der Bericht innerhalb von 3 Werktagen überprüft werden musste. Wenn er an einem Wochenende eingereicht wird, beginnt die Zählung am folgenden Montag:
Und die Differenz zweier Daten in Bezug auf Werktage berechnen:
Als Hinweis, jeder, der 86400 oder 24 * 60 * 60 verwendet, bitte nicht ... Ihre Vergessenszeit ändert sich von Winter- / Sommerzeit, wo ein Tag nicht genau 24 Stunden ist. Die Zeit ist zwar etwas langsamer ('+ 1 Tag', $ Zeitstempel), aber viel zuverlässiger.
quelle
Brutaler Versuch, die Arbeitszeit zu ermitteln - Montag bis Freitag von 8 bis 16 Uhr:
quelle
Unten finden Sie den Arbeitscode zur Berechnung der Arbeitstage ab einem bestimmten Datum.
quelle
Hier ist eine andere Lösung ohne for-Schleife für jeden Tag.
quelle
Erstellen Sie für Feiertage eine Reihe von Tagen in einem Format, das date () erzeugen kann. Beispiel:
Verwenden Sie dann die Funktionen in_array () und date () , um zu überprüfen, ob der Zeitstempel einen Feiertag darstellt:
quelle
Ich hatte das gleiche Bedürfnis, ich begann mit dem ersten Beispiel der Spule und endete damit
hth jemand
quelle
!in_array($enddate,$holidays)
,!in_array(date('Y-m-d',$enddate),$holidays)
wenn ich ein Feiertagsarray wie das von Bobbins verwendet habe -$holidays=array('2013-06-16','2013-07-12','2013-08-05');
Andernfalls überprüfen Sie ein Array voller Daten auf einen Zeitstempel, der immer false zurückgibt.Variante 1:
Variante 2:
Variante 3:
Die zusätzlichen Urlaubsüberlegungen können unter Verwendung von Variationen der oben genannten gemacht werden, indem die folgenden Schritte ausgeführt werden. Hinweis! Stellen Sie sicher, dass alle Zeitstempel dieselbe Tageszeit haben (dh Mitternacht).
Machen Sie eine Reihe von Feiertagsdaten (als Unixtimestamps), dh:
Zeile ändern:
sein :
Getan!
quelle
quelle
Hier ist eine rekursive Lösung. Es kann leicht geändert werden, um nur das neueste Datum zu verfolgen und zurückzugeben.
quelle
quelle
quelle
Berechnen Sie Arbeitstage zwischen zwei Daten, einschließlich Feiertagen und benutzerdefinierten Arbeitswochen
Die Antwort ist nicht so trivial - daher würde ich vorschlagen, eine Klasse zu verwenden, in der Sie mehr konfigurieren können, als sich auf eine vereinfachte Funktion zu verlassen (oder ein festes Gebietsschema und eine feste Kultur anzunehmen). Um das Datum nach einer bestimmten Anzahl von Arbeitstagen zu erhalten, werden Sie:
Funktionsansatz
quelle
Dies ist eine weitere Lösung, die fast 25% schneller ist als das Überprüfen von Feiertagen mit in_array:
quelle
Mit diesem Code-Snippet lässt sich der Geschäftstag ohne Wochenende und Feiertage sehr einfach berechnen:
quelle
Ich weiß, dass ich zu spät zur Party komme, aber ich benutze diese alten Funktionen von Marcos J. Montes, um Feiertage und Werktage herauszufinden. Er nahm sich die Zeit, um ab 1876 einen Algorithmus für Ostern hinzuzufügen, und fügte alle wichtigen US-Feiertage hinzu. Dies kann leicht für andere Länder aktualisiert werden.
quelle
Funktion get_business_days_forward_from_date ($ num_days, $ start_date = '', $ rtn_fmt = 'Ym-d') {
}}
quelle
Die add_business_days haben einen kleinen Fehler. Versuchen Sie Folgendes mit der vorhandenen Funktion, und die Ausgabe erfolgt am Samstag.
Startdatum = Freitag hinzuzufügende Werktage = 1 Feiertagsarray = Datum für den folgenden Montag hinzufügen.
Ich habe das in meiner Funktion unten behoben.
quelle
Ich habe gerade meine Funktion basierend auf Bobbin und Mcgrailm-Code zum Laufen gebracht und einige Dinge hinzugefügt, die für mich perfekt funktionierten.
quelle
Eine Erweiterung der oben von James Pasta angebotenen Funktion, um alle Bundesfeiertage einzuschließen und den 4. Juli (wurde als 4. Juni oben berechnet!) Zu korrigieren und auch den Feiertagsnamen als Array-Schlüssel aufzunehmen ...
/ **
* National American Holidays
* @param string $ year
* @return array
* /
öffentliche statische Funktion getNationalAmericanHolidays ($ year) {
}}
quelle
Ich habe gerade eine API geschrieben, mit der Werktage bearbeitet werden können (keine dieser Lösungen hat für meine Situation ganz funktioniert :-); Hier darauf verlinken, falls es jemand anderes nützlich findet.
~ Nate
PHP-Klasse zur Berechnung von Geschäftstagen
quelle
Vielen Dank an Bobbin, Mcgrailm, Tony, James Pasta und einige andere, die hier gepostet haben. Ich hatte meine eigene Funktion geschrieben, um einem Datum Werktage hinzuzufügen, aber sie mit einem Code geändert, den ich hier gefunden habe. Dies behandelt das Startdatum an einem Wochenende / Feiertag. Dies wird auch Geschäftszeiten behandeln. Ich habe einige Kommentare hinzugefügt und den Code aufgeteilt, um das Lesen zu erleichtern.
quelle
Persönlich denke ich, dass dies eine sauberere und präzisere Lösung ist:
Senden Sie einfach das vorgeschlagene
new
Datum an diese Funktion.quelle