Potrzebuję metody dodawania „dni roboczych” w PHP. Na przykład piątek 05.12 + 3 dni robocze = środa 12/10.
Potrzebuję przynajmniej kodu, aby zrozumieć weekendy, ale najlepiej, aby uwzględniał również święta federalne w USA. Jestem pewien, że w razie potrzeby mógłbym wymyślić rozwiązanie brutalną siłą, ale mam nadzieję, że istnieje bardziej eleganckie podejście. Ktoś?
Dzięki.
Odpowiedzi:
Oto funkcja z komentarzy użytkownika na stronie funkcji date () w podręczniku PHP. Jest to ulepszenie wcześniejszej funkcji w komentarzach, która dodaje obsługę lat przestępnych.
Wprowadź datę początkową i końcową, a także tablicę świąt, które mogą przypadać pomiędzy, a funkcja zwraca dni robocze jako liczbę całkowitą:
źródło
Uzyskaj liczbę dni roboczych bez świąt między dwiema datami:
Użyj przykładu:
Wynik:
Funkcjonować:
źródło
$interval = DateInterval::createFromFormat('1 weekday');
Polecam również użycie$holidays = array_flip($holidays);
przed foreach i skrócenieif isset($holidays[$period->format('Y-m-d')]);
czasu przetwarzania potrzebnego na iterację. Ale zalecamy utworzenie niestandardowej funkcji na święta, aby móc przetwarzać względne święta, takie jak święto dziękczynienialast thursday of november
lub dzień pracyfirst monday of september
Istnieje kilka argumentów dotyczących funkcji date (), które powinny pomóc. Jeśli zaznaczysz datę („w”), poda Ci numer dnia tygodnia, od 0 dla niedzieli do 6 dla soboty. Więc… może coś takiego…
To tylko przybliżony przykład jednej możliwości.
źródło
Kalkulacja urlopów jest niestandardowa w każdym stanie. Piszę wniosek bankowy, do którego potrzebuję twardych reguł biznesowych, ale nadal mogę uzyskać tylko przybliżony standard.
źródło
źródło
Oto funkcja dodawania dni roboczych do daty
Inny post wspomina o getWorkingDays (z komentarzy php.net i zamieszczonych tutaj), ale myślę, że zepsuje się, jeśli zaczniesz w niedzielę, a skończysz w dzień roboczy.
Korzystając z następujących (musisz dołączyć funkcję getWorkingDays z poprzedniego postu)
Daje wynik jako 5, a nie 4
Do wygenerowania powyższego użyto następującej funkcji.
Przynieś święta ...
źródło
Możesz wypróbować tę funkcję, która jest prostsza.
źródło
Funkcja dodawania lub odejmowania dni roboczych od podanej daty, nie uwzględnia świąt.
używaj tak ...
źródło
Moja wersja oparta na pracy @mcgrailm ... poprawiona, ponieważ raport wymagał przeglądu w ciągu 3 dni roboczych, a jeśli zostanie przesłany w weekend, liczenie rozpocznie się w następny poniedziałek:
I obliczając różnicę dwóch dat pod względem dni roboczych:
Uwaga, każdy, kto używa 86400 lub 24 * 60 * 60, proszę nie ... Twój czas zapominania zmienia się z czasu zimowego / letniego, gdzie dzień nie jest dokładnie 24 godziną. Chociaż strtotime jest nieco wolniejszy („+ 1 dzień”, $ timestamp), jest znacznie bardziej niezawodny.
źródło
Brutalna próba wykrycia czasu pracy - od poniedziałku do piątku od 8:00 do 16:00:
źródło
Poniżej znajduje się kod roboczy do obliczenia dni roboczych od podanej daty.
źródło
Oto inne rozwiązanie bez pętli for na każdy dzień.
źródło
W święta utwórz tablicę dni w jakimś formacie, który może wygenerować data (). Przykład:
Następnie użyj funkcji in_array () i date (), aby sprawdzić, czy znacznik czasu reprezentuje święto:
źródło
Miałem tę samą potrzebę, którą zacząłem od pierwszego przykładu szpulki i skończyłem na tym
hth ktoś
źródło
!in_array($enddate,$holidays)
się!in_array(date('Y-m-d',$enddate),$holidays)
w przypadku korzystania z tablicy wakacje przekazany w jak Bobbins' -$holidays=array('2013-06-16','2013-07-12','2013-08-05');
W przeciwnym razie sprawdzają tablicę pełen terminów datownika, który zawsze zwraca false.Wariant 1:
Wariant 2:
Wariant 3:
Dodatkowe uwagi dotyczące dni wolnych od pracy można wykonać, korzystając z odmian powyższego, wykonując następujące czynności. Uwaga! upewnij się, że wszystkie znaczniki czasu są o tej samej porze dnia (tj. o północy).
Stwórz tablicę dat świąt (jako unikatowe znaczniki czasu), np .:
Modyfikuj linię:
być :
Gotowe!
źródło
źródło
Oto rozwiązanie rekurencyjne. Można go łatwo zmodyfikować, aby śledzić i zwracać tylko najnowszą datę.
źródło
źródło
źródło
oblicz dni robocze między dwiema datami, w tym święta i niestandardowy tydzień pracy
Odpowiedź nie jest taka trywialna - dlatego moja sugestia byłaby taka, aby użyć klasy, w której można skonfigurować więcej niż poleganie na uproszczonej funkcji (lub przy założeniu stałych ustawień regionalnych i kultury). Aby uzyskać datę po określonej liczbie dni roboczych:
Podejście funkcjonalne
źródło
To kolejne rozwiązanie, jest prawie 25% szybsze niż sprawdzanie świąt za pomocą in_array:
źródło
Ten fragment kodu jest bardzo łatwy do obliczenia dnia roboczego bez weekendu i dni wolnych od pracy:
źródło
Wiem, że spóźniłem się na imprezę, ale używam starego zestawu funkcji Marcosa J. Montesa do obliczania świąt i dni roboczych. Poświęcił trochę czasu na dodanie algorytmu z 1876 roku na Wielkanoc i dodał wszystkie najważniejsze święta w USA. Można to łatwo zaktualizować dla innych krajów.
źródło
function get_business_days_forward_from_date ($ num_days, $ start_date = '', $ rtn_fmt = 'Ym-d') {
}
źródło
Add_business_days ma mały błąd. Spróbuj wykonać następujące czynności z istniejącą funkcją, a wynik będzie w sobotę.
Data rozpoczęcia = piątek Dni robocze do dodania = 1 Tablica dni wolnych = Dodaj datę na następny poniedziałek.
Poprawiłem to w mojej funkcji poniżej.
źródło
Po prostu moja funkcja działa w oparciu o kod Bobbin i mcgrailm, dodając kilka rzeczy, które działały idealnie dla mnie.
źródło
Ulepszenie funkcji oferowanej przez Jamesa Pastę powyżej, aby uwzględnić wszystkie święta federalne i poprawić 4 lipca (obliczono jako 4 czerwca powyżej!), A także uwzględnić nazwę wakacji jako klucz tablicy ...
/ **
* National American Holidays
* @param string $ year
* @return array
* /
public static function getNationalAmericanHolidays ($ year) {
}
źródło
Właśnie skończyłem pisać API, które można wykorzystać do manipulowania dniami roboczymi (żadne z tych rozwiązań nie działało w mojej sytuacji :-); link do niej tutaj, na wypadek gdyby ktoś inny uznał to za przydatne.
~ Nate
Klasa PHP do obliczania dni roboczych
źródło
Podziękowania dla Bobbin, mcgrailm, Tony, James Pasta i kilku innych, którzy napisali tutaj. Napisałem własną funkcję, aby dodać dni robocze do daty, ale zmodyfikowałem ją za pomocą kodu, który znalazłem tutaj. Dzięki temu data rozpoczęcia przypada na weekend / wakacje. Będzie to również obsługiwać godziny pracy. Dodałem kilka komentarzy i rozbiłem kod, aby był łatwiejszy do odczytania.
źródło
Osobiście uważam, że jest to czystsze i bardziej zwięzłe rozwiązanie:
Po prostu wyślij proponowaną
new
datę do tej funkcji.źródło