根据出生日期和当前日期进行年龄验证

时间:2020-02-17 21:49:49

标签: javascript react-native

因此,我需要通过从用户输入的输入字段的转换日期中减去“今天”日期来计算年龄。尽管需要清理,但是下面的代码仍然有效,但由于RN使用其他JS执行环境,我不得不变得很有创意。请参阅here

我的问题是,没有在此代码段“ b.getMonth()+ 1”中添加“ +1”,那么每次将日期相减的数学计算每次都可以恢复1个月。当我添加“ +1”时,它就像一个超级按钮,为什么呢?如果这是合乎逻辑的解决方法,那么我不介意保留“ +1”,但是我肯定想知道为什么必须要使用“ +1”。

此外,完全可以使用改进的解决方案来解决此问题,请记住,我有一个更简单的功能,在打开调试器时效果很好,一旦关闭,它就无法工作,请参见上面的链接。

getVerifyBirthday(birthday) {
    const b = new Date();
    var verify = birthday.length;

    const utc2 = Date.UTC(b.getFullYear(), b.getMonth() + 1, b.getDate());

    if (verify === 10) {
      const splitBirth = birthday.split('-');
      var mydate = new Date(splitBirth[2], splitBirth[0], splitBirth[1]);

      const a = mydate;
      const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());

      const diffTime = Math.abs(utc2 - utc1);
      const diffYears = (diffTime / (3.15576e+10));

      this.setState({ diffYears: diffYears});

      return diffYears >= 13;
    } else {}
  }

更新

我最终重构了我的原始函数,由于月份从0开始,所以将(+1)保留在月份上,如下所述。我仍然不得不拆分两个日期,当我不拆分两个日期时,我的年龄又回到了NaN / Undefined;不知道这是否可以追溯到RN执行环境与浏览器,但我离题了。

2 个答案:

答案 0 :(得分:1)

我会在这里提出一些自己的建议:

  • 无需烦恼UTC日期(以确保用户 所在时区 是否已经达到13岁,假设他或她出生在同一时区;)
  • 无需拆分mm-dd-yyyy日期字符串即可转换为Date,它可以由new Date()解析
  • 将年份计为365.25天具有一定的误差范围,具体取决于用户出生年份以来经过的确切leap年数量,而可以将整个年份与日期进行比较

对我来说,将日期字符串分解成几天,几个月和几年,然后根据整年的差异减去1年(如果该人今年还没有庆祝生日)做出决定是更有意义的:

const today = new Date().toISOString().slice(0,10), // yyyy-mm-dd
      birthday = '1982-06-21',
      [bYear, bMonth, bDay] = birthday.split('-'),
      [tYear, tMonth, tDay] = today.split('-'),
      diffYears = tYear - bYear - (bMonth > tMonth || bDay > tDay ? 1 : 0)

console.log(diffYears)
.as-console-wrapper{min-height:100%;}

答案 1 :(得分:0)

JavaScript Date对象中的月份从零开始。但是,如果您获得格式化的字符串,则它们将从1开始:

const date = new Date(2020, 1, 17); // 17th of February 2020

console.log("getMonth:", date.getMonth());     //month is 1
console.log("formatted:", date.toISOString()); //month is 2

实际上,实际上是您将两个日期都提前一个月。这类作品:

const originDate = new Date(2020, 1, 17); // 17th of February 2020
const originString = "2020-02-17".split("-");

const dateFromDate = new Date(originDate.getFullYear(), originDate.getMonth() + 1, originDate.getDate())
const dateFromString = new Date(originString[0], originString[1], originString[2])

console.log("dateFromDate:", dateFromDate);     //month is 3
console.log("dateFromString:", dateFromString); //month is 3

当您进行减法运算时,它会趋于平稳,但是您仍然可以在不同天数的月份中遇到日期溢出:

const originDate = new Date(2020, 0, 31);   // 31st of January 2020

const dateFromDate = new Date(originDate.getFullYear(), originDate.getMonth() + 1, originDate.getDate())

console.log("dateFromDate:", dateFromDate); // 1st of March 2020

在大多数情况下,这在逻辑上仍然有效,但是,如果您向前移动数月,势必会遇到问题。因此,在将基于1的数字转换为Date对象时,应该相反地进行 1

const originString = "2020-02-17".split("-");

const dateFromString = new Date(originString[0], originString[1] - 1, originString[2])

console.log("dateFromString:", dateFromString); //month is 2