ජාතික හැඳුනුම්පත් අංකයෙන් උපන් දිනය ලබා ගැනීම සඳහා php කේතයක්

php code to extract date of birth from the Sri Lankan National Identity Card(NIC) number

ශ්‍රී ලංකාවේ ජාතික හැඳුනුම් පත් අංකයෙන් උපන් දිනය ලබා ගැනීමට හැකි බව අප කවුරුත් දන්නා දෙයක්. මෙවැනි අවශ්‍යතාවයක් මතුවූ පසු අන්තර්ජාලයේ සොයා බැලුවත් නිසි පිළිතුරක් නොලැබුන නිසා අතින් පයින් වැඩ දමා පහත කේතය ගොඩ නගා ගත්තා. මෙය සමහර විට පරංගියා කෝට්ටේ ගියා වෙන්න පුලුවන්. හැබැයි මගේ වැඩ වලටනම් හොඳට වැඩ. මෙම function එකට අවශ්‍ය වන එකම input එක ජාතික හැඳුනුම්පත් අංකය පමණයි. හැබැයි එය valid එකක් විය යුතුයි. මම භාවිතා කරන validation function එකත් දාලා තියෙනවා අවශ්‍යනම්. return වන්නේ පහත ආකාරයේ associative array එකක්.

  • $DOB[‘day’] = ඉපදුන දවස
  • $DOB[‘month’] = ඉපදුන මාසයේ අංකය
  • $DOB[‘year’] = ඉපදුන අවුරුද්ද

[php]
function getDOBFromNIC($NIC_No){
//get year
$NIC_year = substr($NIC_No, 0, 2);
settype($NIC_year, “int”);
$add_millenium = substr(date(“Y”, time())-20, 0, 2);
$add_millenium .= “00”;
settype($add_millenium, “int”);
$year = $NIC_year + $add_millenium;
unset($add_millenium);
unset($NIC_year);

//get day of the year
$NIC_day_tmp = substr($NIC_No, 2, -5);
settype($NIC_day_tmp,”int”);
if($NIC_day_tmp > 500){
$NIC_day = $NIC_day_tmp – 500;
}else{
$NIC_day = $NIC_day_tmp;
}
unset($NIC_day_tmp);

//count the day of the year and get the month and the day
$month_counter = 1;
$day_counter = 0;
//whatever the year they consider as 366 days
$monthArr = array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

$i = 0;
while($i<$NIC_day){ $day_counter++; $i++; if($monthArr[$month_counter-1]+1 == $day_counter){ $day_counter = 1; $month_counter++; } } //set to array and return $month = $month_counter; $day = $day_counter; unset($monthArr); unset($month_counter); unset($day_counter); unset($i); $DOB['day'] = $day; $DOB['month'] = $month; $DOB['year'] = $year; return $DOB; } [/php] දැන් මෙම කේත කොටස දෙස මදක් බලමු. [php]$add_millenium = substr(date("Y", time())-20, 0, 2);[/php] මෙම කේත කොටස අදාල වන්නේ NIC එකේ මුල අංක දෙකෙන් නියෝජනය කරන වර්ෂය කුමක්දැයි දැන ගැනීමට. මෙම function එක භාවිත කල application එකට ඇතුලත් කරන දත්ත අයිති පුද්ගලයින් අවම වශයෙන් අවුරුදු 20ක් හෝ ඊට වැඩි අය. එම නිසා වර්තමාන අවුරුද්දෙන් 20ක් අඩුකොට එය අගට "00"ක් append කර ලැබෙන අගය පුද්ගලයා ඉපදුන ශතවර්ෂය ලෙස රැගෙන තිබෙනවා. ඉන්පසු එම ශතවර්ශයට, කලින් NIC එකෙන් ලබා ගත් අගය එකතු කොට අංක හතරකින් යුත් වර්ෂය ලබාගනෙ තිබෙනවා. මෙම කාර්යය කර ගැනීමට මෙයට වඩා හොඳ ක්‍රමයක් දන්නවානම් කරුණාකර සඳහන් කරන්න. මේක නිකන් හිතට හරි මදි වගේ. කොහොම වුනත් මෙම function එක භාවිතා කරනවානම් කුමන context එකක භාවිතා කරනවාද කියන එක දැන ගැනීම වැදගත්. ඒ කියන්නේ ඇතුලු කරන NIC එක අදාල පුද්ගලයාගේ වයස පිළීබඳ යන්තම් හෝ දැනුමක් තිබෙනවානම් හොඳයි. (තව අවුරුදු 70කින් පසුව නිපදවන 1970-80 දශක වල ජීවත් වෙච්ච මිනිසුන් ගැන application එකකට මෙය එච්චර valid නැතිවෙයි =) ) [sourcecode language='php'] $add_millenium .= "00"; settype($add_millenium, "int"); $year = $NIC_year + $add_millenium; [/sourcecode] මෙය ලේසියෙන් කරන්න පුලුවන් function එකක් ඇති කියලා හිතෙන් කියනවා. ඒත් තාම හොයාගන්න බැරි වුනා අංක දෙකක වර්ෂයක් අංක හතරකට හරවන function එකක් ගැන. එහෙම හරවද්දී සාමාන්‍යයෙන් ගන්නේ ඒක 1967-2067 (මට මේ අගය ෂුවර් නෑ) අතර වර්ෂයක් විදිහට. දැන් වර්ෂය හොයාගත්තා. ඊළඟට තියෙන්නේ දවස හොයාගන්න. මුල් අංක දෙකට පසුව එන අංක තුනෙන් වර්ෂයේ ඉපදුන දවස හොයාගන්න පුලුවන් කියලා අපි දන්නවා. හැබැයි එතන පොඩි වෙනස් කිරීමක් තියෙනවා. මම ඒක දන්නේ නැතුව මේක හදන්න ගිහින් පොඩි කාලයක් නෙවෙයි කෑවේ. 87045xxxxv යන අංකයේ 045 කොටසින් කියන්නේ ඔහු වර්ෂයේ 45වැනි දවසේ ඉපදුන බව. ඒ අනුව එය (45-31 = 14) පෙබරවාරි 14 බව දැනගන්න පුලුවන්. මෙය දරණ පුද්ගලයා කාන්තාවක් වුනොත් 045 වෙනුවට 545 (500ක් එකතු කිරීමෙන්) ලෙස NIC අංකය ලබෛනවා. මෙය ප්‍රශ්නයක් නැතුව යනවා පෙබරවාරි 28ට කලින් ඉපදුන අයට. ප්‍රශ්නයක් ඇතිවෙන්නේ ඊට පසු ඉපදුන අයට. ඒ අයගේ උපන් වර්ෂය අධික අවුරුද්දක්ද නැද්ද යන්න සලකා බලන්න වෙනවා. නමුත් එය එසේ කල යුතු නැහැ. අපගේ වර්ෂයේ දවස ගණන් බලන විට අධික අවුරුදු නොවන අවුරුදු වල පෙබරවාරි 28ට පසු ඉපදුන අයට පෙනෙයි තමාගේ උපන් දිනයට එක් දිනයක් වැඩියෙන් අංකය දමා ඇති බව. ඒ පහත හේතුව නිසා. අධික අවුරුද්දක් වුවත් නැතත් පෙබරවාරි වලට දවස් 29ක් ඇති බවට ගණන් බලලා තමයි අංකය දාලා තියෙන්නේ. ඒ අනුව අධික අවුරුද්දක් නොවන අවුරුද්දක xx060xxxxv හෝ xx560xxxxv යනුවෙන් NIC අංකයක් තිබිය නොහැකියි. 87060/87560 කියන්නේ විය නොහැකි සංඛ්‍යා. දැන් ඒ බව මතක තියාගෙන තමයි දින ගණන් කිරීම පටන් ගත යුත්තේ. ඒ සඳහා දමා ඇති loop එක පැහැදිලි ඇති යැයි සිතනවා. පහත ඇත්තේ මම NIC validation වලට සාමාන්‍යයෙන් භාවිත කරන function එක. [sourcecode language='php'] function validate_NIC($nic){ if(strlen($nic) <10){ return false; }else{ if(!((strtolower(substr($nic, -1))=="v")||(strtolower(substr($nic, -1))=="x"))){ return false; }else{ if(!is_numeric(substr($nic,0,9))){ return false; } } } return true; } [/sourcecode] මෙය තව දුරටත් අවශ්‍යනම් වැඩි දියුණු කරගත හැකියි. උදාහරණයක් ලෙස වර්ෂයේ දවස ලෙස 366 හා 501 අතර අංකයක් පැමිණිය නොහැකි බව අපි දැන් දන්නවා.

5 thoughts on “ජාතික හැඳුනුම්පත් අංකයෙන් උපන් දිනය ලබා ගැනීම සඳහා php කේතයක්

  1. හොද වැඩක්

    හැබැයි මං ගාවත් තිබෙනවා උපන් දිනය හොයා ගන්න පුළුවන් ක්‍රමයක් ජාතික හැඳුනුම් පත් අංකයෙන්. ඒක මට යාළුවෙක් දුන්නේ. අවශ්‍ය නම් මේල් එකක් එවන්න.

Leave a Reply

Your email address will not be published. Required fields are marked *