Javascript старше 18 лет в високосные годы - PullRequest
1 голос
/ 22 февраля 2012

Я использую этот JavaScript, чтобы проверить, является ли введенный возраст старше 18 лет.

        function calculateDiffYear(date, month, year)
        {
            var cur = new Date();
            var diff = Math.floor((cur.getTime() - new Date(year, month, date)) / (60 * 60 * 24 * 1000));
                diff -= Math.floor((cur.getFullYear() - year) / 4);

            return diff / 365;
        }

        function checkBorn(sender)
        {
            var root = sender.form;
            var date = root.elements['date'].value;
            var month = root.elements['month'].value - 1;
            var year = root.elements['year'].value;

            if (!isValidDate(date, month, year) || calculateDiffYear(date, month, year) < 18) return false;

            return true;
        }

Если работает почти правильно, за исключением того, что у нас високосный год, он дает старше 18 лет человеку, которому завтра становится 18 завтра , по крайней мере в тестах, которые я делаю с сегодняшней датой. и меняется на последний год. Я попытался добавить это, но не повезло:

if ($('#leap').val()) divider = 366;
else divider = 365;

return diff / divider;

Знаете, как я могу это решить?

Спасибо

Ответы [ 3 ]

14 голосов
/ 22 февраля 2012

Если бы я хотел проверить, была ли конкретная дата более 18 лет назад, я бы сделал что-то вроде этого:

function meetsMinimumAge(birthDate, minAge) {
    var tempDate = new Date(birthDate.getFullYear() + minAge, birthDate.getMonth(), birthDate.getDate());
    return (tempDate <= new Date());
}

if (meetsMinimumAge(new Date(year, month, date), 18)) {
    // is OK, do something
} else {
    // too young - error
}

По сути, это берет предоставленный день рождения, добавляет 18 к нему и проверяет, все еще ли это до или до сегодняшней даты.

1 голос
/ 22 февраля 2012

Мой код проверки возраста выглядит примерно так:

function checkAge(dateofbirth) {
    var yd, md, dd, now = new Date();
    yd = now.getUTCFullYear()-dateofbirth.getUTCFullYear();
    md = now.getUTCMonth()-dateofbirth.getUTCMonth();
    dd = now.getUTCDate()-dateofbirth.getUTCDate();
    if( yd > 18) return true;
    if( md > 0) return true;
    return dd >= 0;
}

Обычно, если разница в году составляет 19 или более, они должны быть больше 18.

В противном случае, еслитекущий месяц - месяц рождения, ему 18 и несколько месяцев.

В противном случае, если текущий день больше или равен дню рождения, им 18 и несколько дней (или это их 18-й день рождения).

Это работает независимо от високосных лет и намного эффективнее, чем ваш текущий код.

0 голосов
/ 11 мая 2018

Вы можете использовать moment.js для подтверждения:

var yourDate = year.toString() + "/" + month.toString() + "/" day.toString();

var date = moment(yourDate, "YYYY/MM/DD"); // There are other formats!
var years = moment().diff(date, 'years', false);

if(years >= 18){
    return true;
}

return false;
...