Javascript: как проверить даты в формате ММ-ДД-ГГГГ? - PullRequest
33 голосов
/ 10 ноября 2008

Я видел потенциальный ответ здесь, но это было для ГГГГ-ММ-ДД: Проверка даты JavaScript

Я изменил приведенный выше код для MM-DD-YYYY, но я все еще не могу заставить его работать:

String.prototype.isValidDate = function() 
{
     var IsoDateRe = new RegExp("^([0-9]{2})-([0-9]{2})-([0-9]{4})$");
     var matches = IsoDateRe.exec(this);
     if (!matches) return false;
     var composedDate = new Date(matches[3], (matches[1] - 1), matches[2]);
     return ((composedDate.getMonth() == (matches[1] - 1)) &&
      (composedDate.getDate() == matches[2]) &&
      (composedDate.getFullYear() == matches[3]));
}

Как заставить приведенный выше код работать для ММ-ДД-ГГГГ и еще лучше ММ / ДД / ГГГГ?

Спасибо.

Ответы [ 20 ]

77 голосов
/ 10 ноября 2008
function isValidDate(date)
{
    var matches = /^(\d{1,2})[-\/](\d{1,2})[-\/](\d{4})$/.exec(date);
    if (matches == null) return false;
    var d = matches[2];
    var m = matches[1] - 1;
    var y = matches[3];
    var composedDate = new Date(y, m, d);
    return composedDate.getDate() == d &&
            composedDate.getMonth() == m &&
            composedDate.getFullYear() == y;
}
console.log(isValidDate('10-12-1961'));
console.log(isValidDate('12/11/1961'));
console.log(isValidDate('02-11-1961'));
console.log(isValidDate('12/01/1961'));
console.log(isValidDate('13-11-1961'));
console.log(isValidDate('11-31-1961'));
console.log(isValidDate('11-31-1061'));

Это работает. (Протестировано с Firebug, следовательно console.log ().)

12 голосов
/ 05 декабря 2011
function isValidDate(date) {
        var valid = true;

        date = date.replace('/-/g', '');

        var month = parseInt(date.substring(0, 2),10);
        var day   = parseInt(date.substring(2, 4),10);
        var year  = parseInt(date.substring(4, 8),10);

        if(isNaN(month) || isNaN(day) || isNaN(year)) return false;

        if((month < 1) || (month > 12)) valid = false;
        else if((day < 1) || (day > 31)) valid = false;
        else if(((month == 4) || (month == 6) || (month == 9) || (month == 11)) && (day > 30)) valid = false;
        else if((month == 2) && (((year % 400) == 0) || ((year % 4) == 0)) && ((year % 100) != 0) && (day > 29)) valid = false;
        else if((month == 2) && ((year % 100) == 0) && (day > 29)) valid = false;
        else if((month == 2) && (day > 28)) valid = false;

    return valid;
}

Проверяет действительные дни каждого месяца и действительные дни високосного года.

5 голосов
/ 05 апреля 2011

Как насчет проверки дат в "ЛЮБОМ" формате даты? Я использую библиотеку DateJS и добавляю ее в существующие формы, чтобы убедиться, что я получаю правильные даты и время, отформатированные так, как я хочу. Пользователь может даже ввести такие вещи, как «сейчас» и «завтра», и они будут преобразованы в действительную дату.

Вот библиотека dateJS: http://www.datejs.com/

и вот совет jQuery, который я написал: http://www.ssmedia.com/utilities/jquery/index.cfm/datejs.htm

4 голосов
/ 04 ноября 2013

Я бы использовал Moment.js для этой задачи. Это позволяет очень просто анализировать даты, а также предоставляет поддержку для обнаружения неверной даты 1 в правильном формате. Например, рассмотрим этот пример :

var formats = ['MM-DD-YYYY', 'MM/DD/YYYY']

moment('11/28/1981', formats).isValid()  // true
moment('2-29-2003', formats).isValid()   // false (not leap year)
moment('2-29-2004', formats).isValid()   // true  (leap year)

Первый moment(.., formats) используется для анализа ввода в соответствии с предоставленным локализованным форматом. Затем вызывается функция isValid для результирующего объекта момента, чтобы мы могли на самом деле определить, является ли она действительной датой.

Это можно использовать для тривиального получения метода isValidDate:

String.prototype.isValidDate = function() {
    var formats = ['MM-DD-YYYY', 'MM/DD/YYYY'];
    return moment("" + this, formats).isValid();
}

1 Поскольку я могу найти небольшой небольшой комментарий по этому вопросу, я бы использовал moment.js только для дат, охватываемых григорианским календарем . Могут быть плагины для других (в том числе исторических или научных) календарей.

3 голосов
/ 10 ноября 2008

Я использую это регулярное выражение для проверки MM-ДД-ГГГГ:

function isValidDate(subject){
  if (subject.match(/^(?:(0[1-9]|1[012])[\- \/.](0[1-9]|[12][0-9]|3[01])[\- \/.](19|20)[0-9]{2})$/)){
    return true;
  }else{
    return false;
  }
}

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

2 голосов
/ 10 ноября 2008

что с этим не работает? вот проверенная версия:

String.prototype.isValidDate = function()   {

    var match   =   this.match(/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/);
    var test    =   new Date(match[3], match[1] - 1, match[2]);
    return (
        (test.getMonth() == match[1] - 1) &&
        (test.getDate() == match[2]) &&
        (test.getFullYear() == match[3])
    );
}

var date = '12/08/1984'; // Date() is 'Sat Dec 08 1984 00:00:00 GMT-0800 (PST)'
alert(date.isValidDate() ); // true
2 голосов
/ 14 октября 2013

Эта функция будет проверять дату, чтобы увидеть, является ли она правильной или имеет правильный формат: ДД / ММ / ГГГГ.

function isValidDate(date)
{
    var matches = /^(\d{2})[-\/](\d{2})[-\/](\d{4})$/.exec(date);
    if (matches == null) return false;
    var d = matches[1];
    var m = matches[2]-1;
    var y = matches[3];
    var composedDate = new Date(y, m, d);
    return composedDate.getDate() == d &&
           composedDate.getMonth() == m &&
           composedDate.getFullYear() == y;
}
console.log(isValidDate('10-12-1961'));
console.log(isValidDate('12/11/1961'));
console.log(isValidDate('02-11-1961'));
console.log(isValidDate('12/01/1961'));
console.log(isValidDate('13-11-1961'));
console.log(isValidDate('11-31-1961'));
console.log(isValidDate('11-31-1061'));
1 голос
/ 24 сентября 2012

Простой способ решить

var day = document.getElementById("DayTextBox").value;

var regExp = /^([1-9]|[1][012])\/|-([1-9]|[1][0-9]|[2][0-9]|[3][01])\/|-([1][6-9][0-9][0-9]|[2][0][01][0-9])$/;

return regExp.test(day);
1 голос
/ 10 ноября 2008

Вы можете несколько упростить это, изменив первые две строки функции на это:

var matches = this.match(/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/);

Или просто измените параметр на конструктор RegExp, чтобы он был

^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$
0 голосов
/ 17 января 2019

Коротко и быстро.

function dateValid(date) {
  var match = date.match(/^(\d\d)-(\d\d)-(\d{4})$/) || [];
  var m = (match[1] | 0) - 1;
  var d = match[2] | 0;
  var y = match[3] | 0;
  return !(
      m < 0 ||                     // Before January
      m > 11 ||                    // After December
      d < 1 ||                     // Before the 1st of the month
      d - 30 > (2741 >> m & 1) ||  // After the 30th or 31st of the month using bitmap
      m == 1 && d - 28 >           // After the 28th or 29th of February depending on leap year
          (!(y % 4) && y % 100 || !(y % 400)));
}

console.log('02-29-2000', dateValid('02-29-2000'));
console.log('02-29-2001', dateValid('02-29-2001'));
console.log('12-31-1970', dateValid('12-31-1970'));
console.log('Hello', dateValid('Hello'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...