• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Algorytm na znajdowanie godzin w podzbiorach dat

Object Storage Arubacloud
0 głosów
203 wizyt
pytanie zadane 19 czerwca 2018 w PHP przez tomek923 Początkujący (480 p.)

Hejka,

może ktoś z Was podsunie mi jakiś pomysł aby rozwiązać problem.

Mam tabele pracowników z godzinami pracy i rezerwacjami. Obie tabele posiadają kolumny z datą rozpoczęcia i zakończenia. Chciałbym teraz wyświetlać godziny dla klientów w których mogliby dokonywać nowe rezerwacji z uwzględnieniem godzin pracy, rezerwacji a także długości trwania zabiegu. Zabiegi mają rożne długości trwania.

Czyli np. dla klientów którzy chcą zarezerwować zabieg wypisuję konkretne godziny w dniach tygodnia

Pn 8:00 - 9:00, 15:00 -16:00

Wt  8:45 - 9:00, 13:00 -15:00

Myślałem żeby daty zapisywać w tablicach i odejmować od siebie. Wypisać najpierw godziny możliwych przyjęć wynikających z harmonogramu pracy a później odejmować rezerwacje.

<?php
function createDateRange($startDate, $endDate, $format = "H:i")
{
    $begin = new DateTime($startDate);
    $end = new DateTime($endDate);

    $interval = new DateInterval('PT45M'); 
    $dateRange = new DatePeriod($begin, $interval, $end);

    $range = [];
    foreach ($dateRange as $date) {
        $range[] = $date->format($format);
    }

    return $range;
	
}
 
$date = createDateRange("2018-06-19 10:00", "2018-06-19 15:00");
var_dump($date);
?>

 

2 odpowiedzi

0 głosów
odpowiedź 19 czerwca 2018 przez Benek Szeryf (91,010 p.)

Musisz potraktować czas w sposób liniowy, a nie za pomocą kalendarza i zegarka. Normalnie poleciłbym Ci konwersję na datę juliańską i operację odwrotną. Jednak jak widać po wartości przekazywanej/zwracanej, data juliańska w PHP jest reprezentowana przez wartość całkowitą (co oznacza że zaimplementowano ją błędnie). Ale możesz nadal ją wykorzystać i obliczyć sobie część ułamkową za pomocą tego algorytmu. Albo możesz sobie wprowadzić "własną liniową datę" liczoną od ustalonego roku. Pamiętaj jednak o latach przestępnych (lata podzielne bez reszty przez 400 lub podzielne przez 4 i jednocześnie niepodzielne przez 100).

komentarz 20 czerwca 2018 przez tomek923 Początkujący (480 p.)
Nie rozumiem jak mi to pomoże w wyliczeniu określonych wolnych godzin rezerwacji. Powiedzmy że wyliczam sobie liczbę godzin/dni pomiędzy dwoma datami czasu pracy. Jak odjąć rezerwacje? Przedziałów  pracy w ciągu dnia może być kilka tak samo rezerwacji.
komentarz 20 czerwca 2018 przez Benek Szeryf (91,010 p.)
Przepraszam, mój błąd. Z Twojego postu wywnioskowałem, że masz problem z manipulacją dat i godzin.
0 głosów
odpowiedź 20 czerwca 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)

Ja bym to zrobił tak:

Użył do tego klasy DateTime i metody getTimestamp, która by mi wyświetliła czas unixowy (czas rozpoczęcia oraz czas zakończenia rezerwacji lub otwartego gabinetu). Czas unixowy jest w formacie liczy całkowitej.

Więc, sprawdziłbym warunkami czy dana godzina jest dostępna w wybranym przedziale.

Np coś takiego:

function checkBookingIsFree(DateTime $startDate, DateTime $endDate, DateTime $checkingDate) {
    if ($checkingDate->getTimestamp() >= $startDate->getTimestamp() 
    && $checkingDate->getTimestamp() <= $endDate->getTimestamp()) {
        return false;
    }
    
    return true;
}

Oczywiście, można by to zrobić obiektowo ale chciałem tutaj pokazać prosty przykład jak to można zrobić

komentarz 20 czerwca 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)

Przykładowe użycie funkcji:
 

checkBookingIsFree(
    new DateTime("2018-02-28 09:00:00"), 
    new DateTime("2018-02-28 15:00:00"), 
    new DateTime("2018-02-28 14:59:59"))

 

komentarz 24 czerwca 2018 przez tomek923 Początkujący (480 p.)

@Paweł Antyporowicz, moim celem jest wyświetlenie godzin możliwych do zarezerwowania, rozumiem że Ty byś zrobił tak, że sprawdzał konkretną godzinę (chciałbym rezerwować co 15 min)  w pętli czy zgodny jest warunek?. Można  wsiąść godzinę startu otwarcia gabinetu i inkrementować tę godzinę o 15 min do godziny zamknięcia gabinetu. W jednym widoku umieszczam 7 dni tygodnia więc trochę  by to zajęło czasu przetworzenie wszystkich pętli. 

komentarz 25 czerwca 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
edycja 25 czerwca 2018 przez Paweł Antyporowicz
Zamiast wyświetlić wszystkie wolne daty, wyświetl godziny zarezerwowane i podaj datę otwarcia gabinetu w ten dzień. Później przy rezerwacji walidujesz tą funkcją czy dana godzina jest wolna w tym dniu, chyba proste?

edit:

musisz trochę zmienić warunek i sprawdzić przedział zarezerwowanego przedziału godzin w gabinecie. Ale mam nadzieje, że już z tym sobie poradzisz.

Podobne pytania

0 głosów
2 odpowiedzi 298 wizyt
pytanie zadane 6 października 2022 w PHP przez mikey Użytkownik (820 p.)
0 głosów
1 odpowiedź 100 wizyt
pytanie zadane 14 czerwca 2019 w PHP przez mknnn221 Początkujący (460 p.)
0 głosów
1 odpowiedź 374 wizyt
pytanie zadane 12 października 2018 w PHP przez kurczaq95 Nowicjusz (150 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...