post_ico4

Skrypt do sprawdzania dni roboczych

Rozwijając swój firmowy CRM napotkaliśmy na ciekawy problem. W jaki sposób sprawdzić, czy aktualny dzień jest dniem pracującym, czy wolnym od pracy? W tym wpisie pokażę jak rozwiązać ten problem.

Dni wolne od pracy

Zgodnie z obowiązującymi przepisami aktualnie jest 13 świąt wolnych od pracy (pełna lista na 2015 rok do sprawdzenia tutaj).Do tego dochodzą soboty i niedziele.

Zdecydowana większość świat ma stałe daty, ale mamy 3 święta ruchome:

  • Wielkanoc
  • Poniedziałek Wielkanocny
  • Boże Ciało

Boże Ciało jest 60 dni po Wielkanocy. Żeby znać wszystkie daty świąt wystarczy poznać datę Wielkanocy w danym roku. Do tego PHP posiada wbudowaną funkcję easter_date().

Funkcja PHP

Mając teoretyczną wiedzę na temat dni wolnych napisanie funkcji PHP jest już proste :)

<?php
/**
 * Funkcja sprawdza czy podana data jest dniem pracującym (TRUE) lub święto/sobota/niedziele (FALSE)
 *
 * @param string $date Data w formacie Y-m-d (np. 2015-08-26)
 * @return boolean
 */
function isThatDateWorkingDay($date) {
    $time = strtotime($date);
    $dayOfWeek = (int)date('w',$time);
    $year = (int)date('Y',$time);

    #sprawdzenie czy to nie weekend
    if( $dayOfWeek==6 || $dayOfWeek==0 ) {
        return false;
    }

    #lista swiat stalych
    $holiday=array('01-01', '01-06','05-01','05-03','08-15','11-01','11-11','12-25','12-26');

    #dodanie listy swiat ruchomych
    #wialkanoc
    $easter = date('m-d', easter_date( $year ));
    #poniedzialek wielkanocny
    $easterSec = date('m-d', strtotime('+1 day', strtotime( $year . '-' . $easter) ));
    #boze cialo
    $cc = date('m-d', strtotime('+60 days', strtotime( $year . '-' . $easter) ));
    #Zesłanie Ducha Świętego
    $p = date('m-d', strtotime('+49 days', strtotime( $year . '-' . $easter) ));

    $holiday[] = $easter;
    $holiday[] = $easterSec;
    $holiday[] = $cc;
    $holiday[] = $p;

    $md = date('m-d',strtotime($date));
    if(in_array($md, $holiday)) return false;

    return true;
}
?>
Co sądzisz o wpisie?
BeżnadziejnySłabyŚredniDobryBardzo dobry (2 głosów, średnia ocen: 5,00 z 5)
Loading...
  • heheszki

    A tu coś bardziej obiektowego http://codereview.stackexchange.com/a/51972

  • nospor

    A tu skrypt ktory liczy liczbe dnie roboczych miedzy jedną datą a drugą…. pisany 100 lat temu ;)
    http://nospor.pl/liczba-dni-roboczych.html

  • Damian Uziębło

    Prosty, krótki i w pełni zrozumiały skrypt. Dziękuję Łukasz! ;)

  • Art

    skrypt fajny, tyle że zielone świątki to u ciebie chyba święto stałe wypadające 05.24 a w kalendarzu dni wolnych do którego zalinkowałeś w 2016 roku wypada 05.15 więc też jest ruchome chyba