2017-07-24 69 views
11

Próbuję dodać 2 dni tygodnia do daty, ale chcę też wykluczyć dni z tablicy.Dodaj dwa dni robocze do tablicy dat z wyłączeniem dat świątecznych

szereg terminów do wykluczenia:

$bankHolidays = array(); 
foreach($obj as $e) { 
    if($e->division == 'england-and-wales') { 
     foreach($e->events as $events) { 
      $bankHolidays[] = $events->date; 
     } 
    } 
} 

dodanie 2 dni pracy do tej pory

$ret = date('d-m-Y', strtotime($bill["charge_customer_at"]. ' +2 weekdays')); 

Jak mogę zawierać szereg dat, aby wykluczyć?

Jako przykład, jeśli moja data to 2017-07-19 i chcę dodać 2 dni tygodnia, to wypisze 2017-07-21.

Ale jeśli 2017-07-21 był w mojej tablicy, powinien pominąć tę datę i kontynuować dodawanie 2 dni roboczych, aby wynik końcowy był również 2017-07-24 z powodu weekendu.

+1

Czytałem poprzez swoje pytanie kilka razy i nie rozumieją swój pożądany wynik. Jestem prawie pewien, że mógłbym to zrobić, jeśli podasz przykład pożądanego rezultatu. –

+0

sprawdź moją aktualizację, podałem przykład. mam nadzieję, że to ma sens – charlie

+0

Niech skrypt zwróci datę + 2 dni. Wykonaj "sprawdzanie świąt", sprawdź, czy ta nowa data istnieje w twojej tablicy wakacyjnej. Jeśli tak, dodaj do niej dzień. Następnie wystarczy sprawdzić, czy jest to dzień tygodnia. Jeśli wygenerowany dzień jest sobotą lub niedzielą, dodaj 1 dzień do daty i ponownie uruchom całą rzecz (zaczynając od sprawdzenia świątecznego). Wygląda na to, że już masz teorię? Po prostu użyj metody 'in_array()'. –

Odpowiedz

12

Można zrobić coś tak prostego, jak użyć pętli while.

$date = '2017-07-25'; 
$reserved = ['2017-07-27', '2017-07-28']; 
$days = 2; 

while ($days > 0) { 
    $date = date('Y-m-d', strtotime($date . ' +1 weekday')); 
    if (! in_array($date, $reserved)) $days--; 
} 

var_dump($date); 
+1

To rozwiązanie dodaje "+1 dzień", gdy OP chce dodać dni tygodnia. – BeetleJuice

+0

Dobre miejsce. Naprawiony. – fubar

+0

Wow. Nigdy bym tego nie pomyślał. +1 za niekonwencjonalność, nieważne, jak szybko to wymyśliłeś. –

2

Znajdź funkcję następnego dnia roboczego z danym przesunięciem.

Poniżej podajemy, w zasadzie, twoją datę, liczbę dni, które chcesz pominąć, w twoim przypadku 2, oraz tablicę świąt, którą wypełniasz, jak pokazujesz w swoim pytaniu. Jeśli dzień powszedni, który jest dużo po Twojej dacie, jest dniem wolnym, dodaje dzień i sprawdza ponownie.

function nextBusinessDay($date, $daysToSkip,$holidays){ 
    $day = date('Y-m-d',strtotime($date. ' + '.$daysToSkip.' weekday')); 
    if(!in_array($day,$holidays)){ 
     return $day; 
    } else { 
     return nextBusinessDay(date('Y-m-d',strtotime($date.' +1 day')), $daysToSkip,$holidays); 
    } 
} 

$date = '2017-07-19'; 
$holidays = ['2017-07-21']; 
echo nextBusinessDay($date,2,$holidays);//returns 2017-07-24 

$date = '2017-07-19'; 
$holidays = ['2017-07-21', '2017-07-24']; 
echo nextBusinessDay($date,2,$holidays);//returns 2017-07-25 like if it were a 4 day weekend 

Przepraszam, że zajęło mi trochę czasu, aby spojrzeć na to i napisać coś. To powinno działać dla ciebie. Rozumiem, że musisz zwrócić pierwszą datę biznesową, która jest dwa dni od określonej daty, a nie dodawać dwa dni tygodnia, dopóki data nie będzie w twojej tablicy świątecznej. Jeśli naprawdę chcesz zachować dodając 2 dni lub jednak wiele dni, a następnie zmienić

return nextBusinessDay(date('Y-m-d',strtotime($date.' +1 day')), $daysToSkip,$holidays); 

do

return nextBusinessDay(date('Y-m-d',strtotime($date.' +'.$daysToSkip.' day')), $daysToSkip,$holidays); 
+0

Dzięki za złożenie tego razem - wydaje się, że zwracają poprawne daty, ale faktycznie działa to w innej funkcji i myślę, że powoduje problem zwracając wartości w 2 funkcje - może to spowodować problem? – charlie

+0

Jaka jest twoja druga funkcja? Zwrot oznacza po prostu, że wartość funkcji jest tym, co jest zwracane. Możesz zagnieździć tyle funkcji, ile chcesz. Pokaż mi, co masz i pokażę ci, jak to zrobić. –