Dekodowanie daty urodzenia i płci z PESEL-u

Wczoraj poprawiałem walidację numeru PESEL w aktualnym projekcie. PESEL zawiera informacje o płci i dacie urodzenia osoby, do wyciągnięcia tych danych napisałem sobie taką klasę.

class Pesel
{
    public static function extractSex($pesel)
    {
        return intval(substr($pesel, 9, 1)) % 2 == 0 ? 1 : 2;
    }

    public static function extractDate($pesel)
    {
        list($year, $month, $day) = sscanf($pesel, '%02s%02s%02s');
        switch (substr($month, 0, 1)) {
            case 2:
            case 3:
                $month -= 20;
                $year += 2000;
                break;
            case 4:
            case 5:
                $month -= 40;
                $year += 2100;
            case 6:
            case 7:
                $month -= 60;
                $year += 2200;
                break;
            case 8:
            case 9:
                $month -= 80;
                $year += 1800;
                break;
            default:
                $year += 1900;
                break;
        }
        return checkdate($month, $day, $year)
            ? new \DateTime("$year/$month/$day")
            : null;
    }
}

Metoda extractSex() zwraca 1 jeśli numer PESEL należy do kobiety lub 2 jeśli do mężczyzny. Metoda extractDate() zwraca obiekt DateTime z datą urodzenia z PESEL-u.

W klasie brakuje walidacji poprawności PESEL-u, ale w moim projekcie załatwia to osobny walidator.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *