Publikované 21. 11. 2021

Generátor rodných čísel pre SR a ČR

Pre vytvorenie náhodného rodného čísla kliknite na tlačidlo "Vygenerovať rodné číslo", prípadne nastavte jeho parametre.


Overenie rodného čísla


Zopár zaujímavostí o rodných rodných číslach

  • rodné čísla boli zavedené koncom 40-rokov 20. storočia v bývalom Československu s cieľom slúžiť ako jedinečný identifikátor fyzickej osoby
  • rodné číslo môže mať dva formáty:
    • 9-miestny tvar RRMMDD/NNN používaný do 31.12.1953, bez kontrolného čísla
    • 10-miestny tvar RRMMDD/NNNK používaný od 01.01.1954, s kontrolným číslom
  • z rodného čísla je možné určiť:
    • dátum narodenia z časti RRMMDD (RR = rok, posledné dvojčíslie, MM = mesiac, DD = deň)
    • pohlavie osoby - ženy majú ku číslici mesiaca pripočítané 50. Napr. 9051012806 je rodné číslo ženy narodenej 1. januára 1990 (január = 1. mesiac + 50 = 51). Rodné číslo muža narodeného v ten istý deň by bolo napr. 9001013967.
    • kontrolné číslo - platí len pre rodné čísla pridelené po 01.01.1954. Kontrolné číslo K je posledná číslica v rodnom čísle doplnená tak, aby zvyšok po delení celého rodného čísla číslom 11 bol nula (tzv. modulo 11). Určí sa ako rozdiel súčtov číslic na párnych a nepárnych pozíciách delených 11. Napríklad pre rodné číslo 8010107182 zistíme súčet číslic na párnych pozíciách (0+0+0+1+2=3) a na nepárnych pozíciách (8+1+1+7+8=25), rozdiel 25-3=22, pričom 22/11=0 a číslo je teda formáne platné. Posledné kontrolné číslo K = 2 zabezpečí delenie jedenástimi bezo zvyšku.
  • denne mohlo byť v rámci celého Československa pridelených najviac 999 čísel novorodencom. V Čechách od roku 2004 pribudla možnosť toto obmedzenie vyriešiť tak, že ak sa vyčerpal v daný deň limit 999 novorodencov, pripočítala sa k mesiacu číslica 20 (v prípade mužov) alebo 70 (v prípade ženy) a číslovanie znovu začalo od 001, 002, ...
  • na Slovensku sa rodné číslo považovalo určitý čas za citlivý osobný údaj napr. aj v rámci GDPR, avšak zákonom 18/2018 Z. z., § 78 ods. 4 bolo toto ponímanie upravené a rodné číslo sa v súčasnosti považuje za národný identifikátor, ktorý má právo zverejniť jedine dotknutá osoba.
  • do roku 1985 bolo pridelených približne 1000 rodných čísel, pre ktoré uvedené pravidlo s kontrolnou číslicou neplatí. Takýto prípad môže nastať, ak je zvyšok po delení rodného čísla rovný desať. V takom prípade sa ako kontrolná číslo použije nula, avšak rodné číslo nie je deliteľné jedenástimi bezo zvyšku. Je možné, že tieto čísla sa vyskytujú v minimálnej miere ešte aj dnes.

Súvisiace linky

Utilita - overenie rodného čísla v PHP

/**
* Validator rodnych cisel pre SR/ČR
* Validator for birth numbers in Slovak / Czech Rep.
*/
class RodneCislo
{
	const
		// gender constants
		GENDER_MALE = 'M',
		GENDER_FEMALE = 'F';

	protected
		/** @var string validated birth number */
		$rc,

		/** @var string birth year */
		$year,

		/** @var string birth month */
		$month,

		/** @var string birth day */
		$day,

		/** @var bool TRUE when birth number valid */
		$bValid,

		/** @var string detected gender, M - male, F - female */
		$gender;

	/**
	* Constructor
	* @param string $birthid e.g. "8010107182" or with slash "801010 / 7182"
	*/
	function __construct($birthid)
	{
		// make birth number format tolerant
		$birthid = $this->rc = str_replace(['/','-', ' '], ['','',''], $birthid);
		$this->bValid = true;

		if (ctype_digit($birthid)) {
			$len = strlen($birthid);

			if($len == 9){
				// old format before 01.01.1954 -> 9-miestne without validation
				$this->year = substr($birthid, 0, 2);
				$this->month = substr($birthid, 2, 2);
				$this->day = substr($birthid, 4, 2);

				if($this->year >= 54){
					$this->bValid = false;
				} else {
					if($this->month >= 51 && $this->month <= 62){
						$this->gender = self::GENDER_FEMALE;
						$this->month -= 50;
					}else{
						$this->gender = self::GENDER_MALE;
					}
					$this->year = "19{$this->year}";
					if (!checkdate($this->month, $this->day, $this->year)) {
						$this->bValid = false;
					}
				}
			}elseif($len == 10){
				// new format from 01.01.1954 - with validation via modulo 11
				$this->year = substr($birthid, 0, 2);
				$this->month = substr($birthid, 2, 2);
				$this->day = substr($birthid, 4, 2);

				// note: v CR sa od 01.01.2004 moze ku mesiacu pripocitat +20 alebo +70
				// https://phpfashion.com/jak-overit-platne-ic-a-rodne-cislo
				if($this->month >= 51 && $this->month <= 62){
					$this->gender = self::GENDER_FEMALE;
					$this->month -= 50;
				}else{
					$this->gender = self::GENDER_MALE;
				}
				if(date("y") >= $this->year){
					$this->year = "20{$this->year}";
				}else{
					$this->year = "19{$this->year}";
				}

				if ($this->year < 1954 || !checkdate($this->month, $this->day, $this->year)) {
					$this->bValid = false;
				} else {
					$check2 = $birthid / 11;
					$check = floor($check2);
					if($check != $check2){
						$this->bValid = false;
					}
				}
			}else{
				$this->bValid = false;
			}
		} else {
			$this->bValid = false;
		}

		if ($this->bValid) {
			$this->month = str_pad($this->month, 2, '0', STR_PAD_LEFT);
			$this->day = str_pad($this->day, 2, '0', STR_PAD_LEFT);
		}
	}

	/**
	* Return TRUE when birth number is valid
	*/
	function isValid()
	{
		return $this->bValid;
	}

	/**
	* Return birth number formatted
	* @param string $delimiter e.g. "/" or " / "
	*/
	function getFormatted($delimiter = '')
	{
		if($this->rc){
			$rc = $this->rc; // without slashes, only numbers, e.g. 8010107182
			if($delimiter && preg_match('/^[ \/\-]+$/', $delimiter)){
				$rc = substr($rc, 0, 6).$delimiter.substr($rc, 6);
			}
			return $rc;
		}
	}

	/**
	* Return formatted birth number e.g. 31.12.2010
	* @param string $delimiter for date parts e.g. "." or "/"
	*/
	function asDate($delimiter = '.')
	{
		if ($this->bValid) {
			return $this->day.$delimiter.$this->month.$delimiter.$this->year;
		}
	}

	/**
	* Return parsed info for birth number
	*/
	function getDetails()
	{
		$a = [];
		if ($this->bValid) {
			$a = [
				'year'   => (int) $this->year,
				'month'  => (int) $this->month,
				'day' 	 => (int) $this->day,
				'gender' => $this->gender,
			];
		}
		return $a;
	}

	/**
	* Return real age calculated towards supplied timestamp
	* @param int $targetTs Timestamp
	* @param string $mode year"empty string - calculate age by year or exact day
	*/
	function getAge($targetTs = 0, $mode = '')
	{
		if ($this->bValid) {
			if ($targetTs === 0) {
				$targetTs = time();
			}
			if (!checkdate(date("m", $targetTs), date("d", $targetTs), date("Y", $targetTs))){
				return false;
			}else{
				if($mode == "year") {
					// age as a difference between years (current year - birth year),
					// regardless of exact birth day
					return intval(date("Y",$targetTs) - $this->year);
				}else {
					// age calculated exactly by birth day
					// e.g. 20200101 - 19900101 = intval(369108 / 10000) = 30
					$birthdate = intval($this->year.$this->month.$this->day);
					return intval((date("Ymd",$targetTs) - $birthdate) / 10000);
				}
			}
		}else{
			return false;
		}
	}

	/**
	* Return gender detected from birth number
	*/
	function getGender()
	{
		return $this->gender;
	}

	/**
	* Return whether birth number belongs to woman
	*/
	function isFemale()
	{
		return self::GENDER_FEMALE == $this->gender;
	}

	/**
	* Return timestamp for birth number
	*/
	function getBirthTime()
	{
		return mktime(0,0,0, intval($this->month), intval($this->day), intval($this->year));
	}
}

Máte otázku?

Synet.sk

Profesionálna tvorba webových aplikácií a riešení na mieru. Konzultačné služby.

Demo

Kontakt


https://synet.sk