2012-02-22 2 views
1

Я использую этот JavaScript, чтобы проверить, если возраст Введенный старше 18.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; 

Вы знаете, как я могу его решить?

Спасибо

+0

Год на самом деле 365.25 дней, поэтому нам нужны високосные годы в первую очередь. Использует ли 365.25 вместо 365 исправить свою математику? – Sparky

+0

@ Sparky672: На самом деле год составляет 365,24 дней. Вот почему каждые 400 лет у нас нет високосного года. –

+0

Деление на 365.24 (или .25) терпит неудачу, так как оно дает менее 18 для тех, кто становится 18 сегодня или даже 2 дня назад, я попробую решение @nnnnnn сейчас ... –

ответ

14

Если бы я хотел, чтобы проверить, является ли конкретная дата была более 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 к нему, и проверяет, что по-прежнему на или до сегодняшней даты.

+0

ok, если сначала вы проверяете аргументы год, месяц и дату (если аргументы NULL , минимальная дата будет создана d)! – silly

+1

@silly - как написано, моя функция 'matchMinimumAge()' просто принимает дату и минимальный возраст для тестирования против, она не создает дату из отдельных частей даты, поэтому предполагается, что любые вызовы, которые функция будет предоставлять действительная дата (в противном случае применяется мусор в мусоре).Это не относится непосредственно к существующему коду OP, но главное - это простой способ тестирования на возраст х лет - адаптация параметров или что-то тривиальное. – nnnnnn

+0

Да, этот работал –

1

Мой возраст проверка кода идет что-то вроде этого:

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

благодаря его полезности, но мне потребовалось некоторое время для преобразования моей строки 01/02/1999, например, на сегодняшний день с помощью метода 'getUTCFullYear()' он принял только 'getFullYear()', потому что его не поддерживали или что-то в этой конкретной ситуации – shareef

+0

я назвал его так: checkAge (новая дата (InfoDateOfBirth.value.split ("/") [2], InfoDateOfBirth.value.split ("/") [1], InfoDateOfBirth.value.split ("/") [0])) 'и работал другим способом если передано как строка, существует нехватка в возрасте от 2-летнего приложения, я не знаю, почему и он работал для 'getUTCFullYear()' в отношении моего последнего комментария – shareef