OA 系統、人資管理、會員註冊等需從身分證字號快速推導基本資料的場合。
// 取得輸入的身分證字號
var idNumber = $("#UUserCard").val();
// 1. 出生日期:第 7-14 碼 (YYYYMMDD)
var birthDate = idNumber.substring(6, 10) + "-" +
idNumber.substring(10, 12) + "-" +
idNumber.substring(12, 14);
// 格式:1990-05-15
// 2. 性別:第 17 碼,奇數=男,偶數=女
var genderCode = parseInt(idNumber.substr(16, 1));
var gender = (genderCode % 2 === 1) ? "男" : "女";
// 3. 年齡計算
var today = new Date();
var birthYear = parseInt(idNumber.substring(6, 10));
var birthMonth = parseInt(idNumber.substring(10, 12));
var birthDay = parseInt(idNumber.substring(12, 14));
var age = today.getFullYear() - birthYear - 1;
// 判斷今年生日是否已過
if (birthMonth < today.getMonth() + 1 ||
(birthMonth === today.getMonth() + 1 && birthDay <= today.getDate())) {
age++;
}
// age 即為計算出的年齡
// 取得入職日期字串 (格式:YYYY-MM-DD)
var hireDateStr = $("#UToTime").val();
var parts = hireDateStr.split("-");
// 注意:JavaScript 月份 0-11,需減 1
var hireDate = new Date(parts[0], parts[1] - 1, parts[2]);
var now = new Date();
var diffMs = now.getTime() - hireDate.getTime();
// 轉換為 Date 物件取得年月日差異
var diffDate = new Date(diffMs);
// 結果格式:X年Y月Z日
var workAge = (diffDate.getFullYear() - 1970) + "年" +
diffDate.getMonth() + "月" +
diffDate.getDate() + "日";
public static class IdCardHelper
{
/// <summary> 解析 18 位身分證字號 </summary>
public static (DateTime BirthDate, string Gender, int Age) Parse(string idNumber)
{
if (string.IsNullOrWhiteSpace(idNumber) || idNumber.Length != 18)
throw new ArgumentException("身分證字號格式錯誤");
var birthDate = DateTime.ParseExact(idNumber.Substring(6, 8), "yyyyMMdd", null);
var gender = (int.Parse(idNumber[16].ToString()) % 2 == 1) ? "男" : "女";
var today = DateTime.Today;
var age = today.Year - birthDate.Year;
if (birthDate > today.AddYears(-age)) age--;
return (birthDate, gender, age);
}
/// <summary> 計算工齡 </summary>
public static string CalculateWorkAge(DateTime hireDate)
{
var now = DateTime.Now;
int years = now.Year - hireDate.Year;
int months = now.Month - hireDate.Month;
int days = now.Day - hireDate.Day;
if (days < 0) { months--; days += DateTime.DaysInMonth(now.Year, now.Month - 1); }
if (months < 0) { years--; months += 12; }
return $"{years}年{months}月{days}日";
}
}
<input type="text" id="UUserCard" placeholder="身分證字號" onblur="parseIdCard()" />
<input type="text" id="UBirthDate" readonly />
<input type="text" id="UGender" readonly />
<input type="text" id="UAge" readonly />
<script>
function parseIdCard() {
var id = $("#UUserCard").val();
if (!/^\d{17}[\dXx]$/.test(id)) return;
$("#UBirthDate").val(id.substring(6,10)+"-"+id.substring(10,12)+"-"+id.substring(12,14));
$("#UGender").val(parseInt(id[16])%2===1 ? "男" : "女");
var today=new Date(), by=parseInt(id.substring(6,10)), bm=parseInt(id.substring(10,12)), bd=parseInt(id.substring(12,14));
var age=today.getFullYear()-by-1;
if(bm<today.getMonth()+1||(bm===today.getMonth()+1&&bd<=today.getDate())) age++;
$("#UAge").val(age);
}
</script>