javascript 从南非身份证号码生成出生日期

c8ib6hqw  于 2023-05-16  发布在  Java
关注(0)|答案(2)|浏览(115)

如何从南非身份证号码生成出生日期?
身份证号码的前6位数字以YYMMDD格式表示其出生日期。
从用户输入的ID号中,我想提取前6个字符,并使用它以dd/mm/yyyy填写出生日期输入Date
这是我的代码,以获得前6位数字作为有效日期:

var currDate = new Date(saIDNumber.substring(0, 2),
                        saIDNumber.substring(2, 4) - 1,
                        saIDNumber.substring(4, 6)); 
var id_date  = currDate.getDate(); 
var id_month = currDate.getMonth(); 
var id_year  = currDate.getFullYear();

代码不会自动生成出生日期,但也不会显示任何错误。

xzlaal3s

xzlaal3s1#

不需要使用 Date 对象,与OP代码相同的结果由下式给出:

var id_date  = saIDNumber.substring(4, 6);
var id_month = saIDNumber.substring(2, 4); 
var id_year  = "19" + saIDNumber.substring(0, 2);
  • Date* 构造函数将年份值0到99视为1900 + year(参见步骤5.j.ii)。

自1999年以来出生的人(即年份值00到23)将被视为1900到1923。你可能会认为,任何身份证的年份是在目前的两位数的年份之前,必须在21世纪,但将有百岁老人谁将再次儿童。;-)
所以:

function getIDDate(saIDNumber) {
    let currentYear = new Date().getFullYear() % 100;
    let [year, month, day]  = saIDNumber.match(/\d\d/g);
    return `${day}/${month}/${(year <= currentYear? '20' : '19') + year}`;
}

['931205','150124'].forEach( id =>
  console.log(`${id} => ${getIDDate(id)}`)
);

这不会验证值,它们可能不表示有效的日期。
附言
new Date().getFullYear() % 100可能是new Date().getYear(),但我认为前者在获得适当的年份值方面更清楚。

8yoxcaq7

8yoxcaq72#

重写我的答案一点,因为我发现一些问题后,阅读评论!一般来说,你的代码可以工作,但是你会遇到1999年之后的日期的问题,因为在那之后的两位数的年份可以以前导零开始,这在数字中是不允许的。例如,在控制台运行console.log(001234)将产生668,因为it apparently will try to convert this number into octal
因此,您绝对必须将“数字”输入为数字字符串,以确保您的数据准确。这意味着您必须始终将这些数字保存为字符串,并将它们作为字符串传递。
另一个问题是,1999年以后的日期将采用“19”前缀。因此,'001205'的数字将假定00表示的年份是1900,而不是2000。正如上面的评论中指出的那样,一个人超过100岁的可能性为0.025%,而这个国家的一个这么老的人甚至可能没有被颁发过号码,这似乎可以安全地假设他们在本世纪穿着。
我认为解决这个问题的一个好方法是将两位数输入年份与当前年份的最后两位数进行比较。当我写这是2023,所以成为23。下面是一些例子

  • 输入的年份05小于23,因此我们可以在20之前添加,因此全年为2005
  • 输入的年份27大于23,因此我们可以在前面加上19,因此全年为1927

以下是我的建议,考虑到了所有这些。我还删除了对Date对象的需要。这意味着我们现在也不需要从月份中减去1。我们可以从字符串中获取数字,然后将它们解析为真实的。

function parseIdNumber(numStr){
  //if the last 2 digits of the input year are less than the last 2 of the current year
  //assume they were born after the year 2000
  var currentYearTwoDigits = parseInt(new Date().getFullYear().toString().substring(2,4), 10);
  var inputYear = parseInt(numStr.substring(0, 2), 10);
  var bestGuessYear = (inputYear < currentYearTwoDigits ? '20' : '19') + inputYear;

 return {
  day: parseInt(numStr.substring(4, 6), 10),
  month: parseInt(numStr.substring(2, 4), 10),
  year: parseInt(bestGuessYear, 10)
 }
}

console.log(parseIdNumber('541213'));
console.log(parseIdNumber('841003'));
console.log(parseIdNumber('930214'));
console.log(parseIdNumber('991205'));
console.log(parseIdNumber('000101'));
console.log(parseIdNumber('071205'));
console.log(parseIdNumber('220824'));

相关问题