У меня есть валидатор, который проверяет, является ли пользователь не моложе 18 лет.
Это проверка:
var res = /^([1-2]\d{3})\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])\-([0-9]{4})$/.exec(str);
var todays_date = new Date();
var birth_date = null;
if (res != null) {
birth_date = new Date(res[1], res[2], res[3]);
if (todays_date - birth_date > 565633905872) {
565633905872 составляет 18 лет в миллисекундах. но как я могу преобразовать его в годы, прежде чем я могу просто сделать
if (todays_date - birth_date => 18) {
Число, которое вы указали, - это не количество миллисекунд за 18 лет. Он слишком мал, даже если вы притворяетесь, что нет високосных лет.
Самый простой способ проверить, кому-то не моложе 18 лет, - инициализировать объект даты до своего дня рождения, а затем использовать .getFullYear()
и .setFullYear()
чтобы напрямую установить год на 18 лет вперед. Затем сравните это с текущей датой.
Также обратите внимание, что в датах JS месяц основан на нуле, поэтому вы, вероятно, захотите использовать res[2] - 1
при создании объекта даты.
birth_date = new Date(res[1], res[2] - 1, res[3]);
birth_date.setFullYear(birth_date.getFullYear() + 18);
if (birth_date <= new Date()) {
Или, учитывая, что вы birth_date
из отдельного года, месяца и дня, вы можете просто сделать:
birthPlus18 = new Date(+res[1] + 18, res[2] - 1, res[3]);
if (birthPlus18 <= new Date()) {
(Ведущий +
в +res[1] + 18
не является опечаткой, он преобразует строку, извлеченную вашим регулярным выражением, в число, чтобы вы могли добавить к ней 18. Вам не нужно делать то же самое для res[2] - 1
потому что -
автоматически преобразует оба операнда.)
Также обратите внимание, что ваше регулярное выражение с радостью позволит указать даты, которые указывают день, который слишком высок для месяца, например, 30 февраля или 31 июня.
Разделите свою миллисекунду на 31536000000, вы получите количество лет
Есть лучшие способы проверить это (см. Ответ "nnnnnn"). Но ваш вопрос был не о лучшем способе, а о том, как вы могли бы преобразовать в годы.
Вы можете написать функцию, которая делает это, например:
function convertmili( mSeconds )
{
return mSeconds / 31536000000;
}
Выход этой функции еще далек от идеала, потому что ваш пример будет выводить: 17.9361334941654
Таким образом, мы могли бы немного почистить его:
function convertmili( mSeconds )
{
var checkYear = Math.floor(mSeconds / 31536000000);
return checkYear;
}
С помощью этой функции ваш пример будет выводить 17, а затем вы можете проверить его так, как вы хотели.