Autor Zpráva
Taps
Profil
Zdravím, může mi prosím někdo poradit jak jednoduše a optimalizovaně vytvořit skript pro výpočet datumu doručení ( bez víkendů a státních svátků). Budu mít např. 3 dopravce a k aktuálnímu datumu budu příčítat x dní. Děkuji
M4n
Profil *
Objekt DateTime bude asi stačit. Konstruktor používá stejnou logiku jako strtotime() a bude tak rozumět i zápisu '+ 3 weekdays', což pro tuto chvíli vrátí pondělí 22. Státní svátky už budeš muset zkontrolovat sám — jestli nějaký den leží mezi dvěma daty, na to se u objektů DateTime dají použít obyčejné operátory nerovnosti.
Kcko
Profil
Výňatek z jedné mojí starší Nette komponenty:



// ukaze na velikonocni nedeli, napric vsemi casovymi pasmy, jinak funkce easter_day se chova obcas divne, viz php.net
    public function getEasterDateTime($year) 
    {
        $base = new \DateTime("$year-03-21");
        $days = easter_days($year);
        return $base->add(new \DateInterval("P{$days}D"));
    }
    public function isNotHoliday(\Datetime $date)
    {
        // statni svatky
        $holidays = array('01-01', '05-01', '05-08', '07-05', '07-06', '09-28', '10-28', '11-17', '12-24', '12-25', '12-26');
        
        // velikonocni pondeli
        $holidays[] = $this->getEasterDateTime(date('Y'))->modify('+1day')->format('m-d');
        
        // velky patek, (pred velikonocnim pondelim)
        $holidays[] = $this->getEasterDateTime(date('Y'))->modify('-2day')->format('m-d');
        
        $day        = $date->format('w');
        if ($day == 0 || $day == 6) 
            return FALSE;
        if (in_array($date->format('m-d'), $holidays)) 
            return FALSE;
        return TRUE;
    }
    function getDeliveryDate($actualDate, $dayDelay = 0)
    {
        $actualDate = new \DateTime($actualDate);
        $actualDate->modify("+$dayDelay day");
        while (!$this->isNotHoliday($actualDate))
        {    
            $actualDate->modify('+1 day');
        }
        return $actualDate;
    }

Dál už to zvládneš ne?
Taps
Profil
Super, dekuji

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0