Munkanapok meghatározása két dátum között
2015-03-05T08:21:56+01:00
2021-10-30T00:27:55+02:00
2022-08-12T05:15:44+02:00
lgyaraki
Sziasztok!

A tárgyban említett dologban kérek segítséget. Van hét dátumintervallumom, mely tartományok lehetnek idegenek, vagy lehet a metszetük nem üres halmaz. Meg kellene határozni a bennük lévő munkanapok számát.
Gondoltam arra, hogy még kliens oldalon megcsinálom, hogy ne terheljem a szervert, akkor JS-ben kellene rá megoldást találni.
A gondot az jelenti az algoritmusban, hogy a dátumintervallumokba beleeshet hétvége, fix ünnep nap(aug. 20, dec. 25-26) és mozgó ünnep (húsvét, pünkösd). Ráadásul lehet benne áthelyezett munkanap, vagy éppen szabadnap (valamelyik ünnep keddre, vagy csütörtökre esése miatt).

Azt találtam ki, hogy a mozgóünnepeket és a többi különleges napot eltárolom adatbázisban, onnan beolvastatom JS tömbbe (mondjuk az előző éviektől a következő éviekig), mikor betöltöm az oldalt.
Csak azt nem tudom, hogy az intervallumokból hogyan szedjem ki a munkanapokat.

Segítségeteket előre is köszönöm!
Mutasd a teljes hozzászólást!
Valami hasonló megoldásra (exclude és weekwnds) gondolsz?...
Akkor hasonlóan keresd...
És egy hasonló kérdés és válasz...
Megj: Ez utóbbit, ha próbálod, elsőre a $holidays tömb legyen üres!!!
*************************
És egy próba
//Próba $holidays1=array(); // kívül belül belül kívül esik az intervallumom $holidays2=array("2015-03-08", "2015-04-30", "2015-04-31", "2015-06-20"); echo 'Ha nem esik hétköznapra fizetett ünnep a választott időszakban: <b>'. getWorkingDays("2015-04-01","2015-05-15",$holidays1).'</b> munkanap<br>'; echo 'Ha hétköznapra kettő fizetett ünnep esik a választott időszakban: <b>'. getWorkingDays("2015-04-01","2015-05-15",$holidays2).'</b> munkanap';
Mutasd a teljes hozzászólást!

  • Én a faék-egyszerű megoldást választanám:

    Csinálnék egy táblát MUNKANAPOK(EV,HONAP,NAP,MUNKASZUNET).  Ezt automatikusan felölteném az alábbi szabály szerint:
    - ha EV-HONAP-NAP szombat vagy vasárnap, akkor MUNKASZUNET=1
    - minden más esetben MUNKASZUNET=0.  

    Ezt követően felvenném a plusz munkaszüneti napokat -kézzel- innen (18 rekord módosítása):  MUNKAIDŐ NAPTÁR 2015

    Majd az alábbi bonyolult lekérdezést alkalmaznám: select count(MUNKASZUNET) as SZUNNAPOK_SZAMA from MUNKANAPOK where to_date(EV-HONAP-NAP) between :D1 AND :D2
    Mutasd a teljes hozzászólást!
  • Régebben ezt nagyon kitárgyaltuk (most nem keresem meg a topic-ot)

    példa:
    <?php require("workdays.php"); $twd = new WorkDays(); $twd->setHoliday(array('Saturday','Sunday','Monday')); // $twd->setHolidate(array('2015-01-12','2015-03-26','2015-03-27','2015-03-28')); echo $twd->calculate("2015-01-01", "2015-01-31") . " Working days.";
    --[class:
    <?php class WorkDays { private $_holidays = array(); private $_holidates = array(); private $_tWDays = 0; public function __construct() { date_default_timezone_set("UTC"); $this->_tWDays = 0; } public function setHoliday($daysArray) { $this->_holidays = $daysArray; } public function setHolidate($datesArray) { foreach ($datesArray as $k=>$v) { $datesArray[$k] = strtotime($v); } $this->_holidates = $datesArray; } public function calculate($startDate, $endDate) { $dtInfo = date_parse($startDate); if ($dtInfo['warning_count'] != 0 || $dtInfo['error_count'] != 0) { return 'Start Date is not a valid date'; } $dtInfo = date_parse($endDate); if ($dtInfo['warning_count'] != 0 || $dtInfo['error_count'] != 0) { return 'End Date is not a valid date'; } $diff = floor((strtotime($endDate)-strtotime($startDate))/(60*60*24)); $checkDate = $startDate; for($i=1;$i<=$diff;$i++) { if (count($this->_holidays) > 0) { if (!in_array(date('l', strtotime($checkDate)), $this->_holidays)) { if (count($this->_holidates) > 0) { if (!in_array(strtotime($checkDate), $this->_holidates)) { $this->_tWDays += 1; } } else { $this->_tWDays += 1; } } } elseif (count($this->_holidates) > 0) { if (!in_array(strtotime($checkDate), $this->_holidates)) { $this->_tWDays += 1; } } else { $this->_tWDays += 1; } $checkDate = date("d-m-Y", (strtotime($startDate)+($i*24*60*60))); } return $this->_tWDays; } } ?>
    Mutasd a teljes hozzászólást!
  • Nem igazán javasolnám a kliens oldali megoldásokat, mert a munkanapokat sok minden változtathatja.
    nézelődj itt, és a kapcsolódó cikkekben és rengeteg megoldást találhatsz olyan kérdésre is, ami még fel sem merült.

    Calendar Tables - SQLServerCentral
    Mutasd a teljes hozzászólást!
  • Nem én vagyok a kérdező és ha jól emlékszem a "2015.03.05. 08:38"- javaslatom kódja PHP-s...
    Mutasd a teljes hozzászólást!
  • Az áthelyezett munkanapokat és a nem fix ünnepeket külön táblába pakolom.
    Mutasd a teljes hozzászólást!
  • Köszönöm! Erről is szó van a belinkelt cikkben...
    Mutasd a teljes hozzászólást!
abcd