неправильная проверка даты, когда год типа «dd.mm.0302» или «27.08.0974» в JS

У меня проблема с проверкой даты из базы данных, некоторые годы в полях даты неверны (например, 28.02.0302), я должен их проверить. Я пробую некоторые функции из Интернета, но они подтверждают эту дату как действительную. Как заставить их работать? Вот функция, которую я пробовал:

function isValidDate(d) {


if ( Object.prototype.toString.call(d) !== "[object Date]" )
    return false;
  return !isNaN(d.getTime());

}

function isValidDate11(s) {
    // format D(D)/M(M)/(YY)YY
    var dateFormat = /^\d{1,4}[\.|\/|-]\d{1,2}[\.|\/|-]\d{1,4}$/;

    if (dateFormat.test(s)) {
        // remove any leading zeros from date values
        s = s.replace(/0*(\d*)/gi,"$1");
        var dateArray = s.split(/[\.|\/|-]/);

        // correct month value
        dateArray[1] = dateArray[1]-1;

        // correct year value
        if (dateArray[2].length<4) {
            // correct year value
            dateArray[2] = (parseInt(dateArray[2]) < 50) ? 2000 + parseInt(dateArray[2]) : 1900 + parseInt(dateArray[2]);
        }

        var testDate = new Date(dateArray[2], dateArray[1], dateArray[0]);
        if (testDate.getDate()!=dateArray[0] || testDate.getMonth()!=dateArray[1] || testDate.getFullYear()!=dateArray[2]) {
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }
}

person Andy Hrishmanovskiy    schedule 26.09.2014    source источник
comment
Эта дата в некотором роде действительна. Есть ли у вас какие-то особые ограничения на свидание?   -  person SimY4    schedule 26.09.2014


Ответы (1)


Потому что дата, которую вы пытаетесь: 28.02.0302 с вашим скриптом фактически изменить эту дату на 28 февраля 2202 года. Так что это действительно действительная дата.

Есть две части этого сценария, которые приводят к тому, что ваша дата фактически проверяется как 2202:

Эта часть удаляет ведущие нули из значений даты, делая год от 0302 до 302.

// remove any leading zeros from date values
   s = s.replace(/0*(\d*)/gi,"$1");

Эта вторая часть проверяет, содержит ли дата менее 4 символов, и добавляет 2000, если меньше 50, и 1900, если больше.

    // correct year value
    if (dateArray[2].length<4) {
         // correct year value
        dateArray[2] = (parseInt(dateArray[2]) < 50) ? 2000 + parseInt(dateArray[2]) : 1900 + parseInt(dateArray[2]);
    }

Вторая часть немного сложнее. Я предполагаю, что это было сделано, чтобы утвердить дату 01.01.12 как 01.01.2012 и дату 01.01.93 как 01.01.1999

Это на самом деле не нужно, и вы можете изменить функцию на:

function isValidDate11(s) {
    // format D(D)/M(M)/(YY)YY
    var dateFormat = /^\d{1,4}[\.|\/|-]\d{1,2}[\.|\/|-]\d{1,4}$/;

    if (dateFormat.test(s)) {
        var dateArray = s.split(/[\.|\/|-]/);
        // correct month value
        dateArray[1] = dateArray[1]-1;

        var testDate = new Date(dateArray[2], dateArray[1], dateArray[0]);

        if (testDate.getDate()!=dateArray[0] || testDate.getMonth()!=dateArray[1] || testDate.getFullYear()!=dateArray[2]) {
            return false;
        } else {
            return true;
       }
   } else {
        return false;
   }
}

Тем не менее дата 28.02.0302 действительна, потому что она проверяется как 28 февраля 302 года.

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

Поскольку у вас проблемы с 0302, я думаю, вам может понадобиться дата с 4-значным годом, у которого нет начального нуля:

function isValidDate11(s) {
    // format D(D)/M(M)/YYYY
    var dateFormat = /^\d{1,4}[\.|\/|-]\d{1,2}[\.|\/|-]\d{4}$/;

    if (dateFormat.test(s)) {
           // remove any leading zeros from date values
        s = s.replace(/0*(\d*)/gi,"$1");
        var dateArray = s.split(/[\.|\/|-]/);
        // correct month value
        dateArray[1] = dateArray[1]-1;

        if(dateArray[2].length != 4){
          return false;
        }

        var testDate = new Date(dateArray[2], dateArray[1], dateArray[0]);

        if (testDate.getDate()!=dateArray[0] || testDate.getMonth()!=dateArray[1] ||     testDate.getFullYear()!=dateArray[2]) {
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }
}

Это решит вашу проблему с годом 0302, но не будет работать с датой, заканчивающейся годом только с двумя символами .14.

person Kesty    schedule 26.09.2014
comment
Спасибо, я попробую ваш код, для меня такие годы, как 0302 или 0947 (начинаются с 0) неверны, и я должен интерпретировать их как неправильные, я создаю отчет, который выполняет некоторые проверки с личными данными, и если эта дата неверна, то в отчете я помечаю это поле неправильно - person Andy Hrishmanovskiy; 26.09.2014