Проверьте, является ли строка значением даты

Что является простым способом проверить, является ли значение действительным 10-11-2009, любой известный формат даты разрешен.

Например , у меня есть значения 10/11/2009, 2009-11-10T07:00:00+0000, 200которые все должны быть признаны в качестве значения даты, и значений 10, 350, Date.parse(), , которые не должны быть признаны в качестве значения даты. Каков самый простой способ проверить это, если это возможно? Потому что временные метки также будут разрешены.

javascript,date-format,

123

Ответов: 18


Было бы Dateдостаточно?

См. Его относительную страницу документации MDN .


Обновление 2015 года

Это старый вопрос, но другие новые вопросы:

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

Большинство ответов здесь либо используют некоторые сложные регулярные выражения, которые соответствуют только некоторым очень конкретным форматам, и на самом деле делают это неправильно (например, сопоставляя 32 января, не сопоставляя фактическую дату ISO, как рекламируется - см. Демонстрацию ), или они пытаются передать что-либо Dateконструктору и желаем лучшего.

Использование Moment

Как я объяснил в этом ответе, в настоящее время для этого доступна библиотека: Moment.js

Это библиотека для анализа, проверки, обработки и отображения дат в JavaScript, которая имеет гораздо более богатый API, чем стандартные функции обработки дат JavaScript.

Это 12kB minified / gzipped и работает в Node.js и в других местах:

bower install moment --save # bower
npm install moment --save   # npm
Install-Package Moment.js   # NuGet
spm install moment --save   # spm
meteor add momentjs:moment  # meteor

Используя Moment, вы можете быть очень конкретным относительно проверки правильных дат. Иногда очень важно добавить некоторые подсказки о формате, который вы ожидаете. Например, дата, такая как 06/22/2015, выглядит как действительная дата, если вы не используете формат DD / MM / YYYY, и в этом случае эта дата должна быть отклонена как недействительная. Есть несколько способов, как вы можете сказать Moment, какой формат вы ожидаете, например:

moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false

trueАргумент есть поэтому момент не будет пытаться разобрать вход , если он не точно соответствовать одному из форматов , предоставляемых (это должно быть поведение по умолчанию , на мой взгляд).

Вы можете использовать внутренний формат:

moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true

И вы можете использовать несколько форматов в виде массива:

var formats = [
    moment.ISO_8601,
    "MM/DD/YYYY  :)  HH*mm*ss"
];
moment("2015-06-22T13:17:21+0000", formats, true).isValid(); // true
moment("06/22/2015  :)  13*17*21", formats, true).isValid(); // true
moment("06/22/2015  :(  13*17*21", formats, true).isValid(); // false

См. DEMO .

Другие библиотеки

Если вы не хотите использовать Moment.js, есть и другие библиотеки:

Обновление 2016 года

Я создал модуль immoment , подобный (подмножество) Moment, но без сюрпризов, вызванных мутацией существующих объектов (подробнее см. В документах ).

Обновление 2018 года

Сегодня я рекомендую использовать Luxon для обработки даты / времени вместо Moment, который (в отличие от Moment) делает весь объект неизменным, поэтому нет неприятных сюрпризов, связанных с неявной мутацией дат.

Больше информации

Смотрите также:

Серия статей Роба Гравелла по JavaScript-синтаксическому анализу:

Нижняя линия

Конечно, любой может попытаться изобрести колесо, написать регулярное выражение (но, на самом деле, пожалуйста, прочитайте ISO 8601 и RFC 3339, прежде чем вы это сделаете) или вызовите конструкторы buit-in со случайными данными для синтаксического анализа сообщений об ошибках типа 'Invalid Date'(вы уверены, что это сообщение точно так же на всех платформах? Во всех локалях? В будущем?), или вы можете использовать проверенное решение и использовать свое время для его улучшения, а не изобретать его повторно. Все перечисленные здесь библиотеки являются свободным программным обеспечением с открытым исходным кодом.


Вот как я решил эту проблему в приложении, над которым я сейчас работаю:

обновлено на основе отзывов от крильгара:

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}

или...

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date" && !isNaN(new Date(date)) ) ? true : false;
}

....


15

new Date(date) === 'Invalid Date'работает только в Firefox и Chrome. IE8 (тот, который у меня есть на моей машине для тестирования) дает NaN.

Как было заявлено к принятому ответу, Date.parse(date)также будет работать и число. Поэтому, чтобы обойти это, вы также можете проверить, что это не номер (если это то, что вы хотите подтвердить).

var parsedDate = Date.parse(date);

// You want to check again for !isNaN(parsedDate) here because Dates can be converted
// to numbers, but a failed Date parse will not.
if (isNaN(date) && !isNaN(parsedDate)) {
    /* do your work */
}

6

Как насчет чего-то подобного? Он будет проверять, является ли это объектом Date или строкой даты:

function = isDate(value) {
  var dateFormat;
  if (toString.call(value) === '[object Date]') {
    return true;
  }
  if (typeof value.replace === 'function') {
    value.replace(/^s+|s+$/gm, '');
  }
  dateFormat = /(^d{1,4}[.|\/|-]d{1,2}[.|\/|-]d{1,4})(s*(?:0?[1-9]:[0-5]|1(?=[012])d:[0-5])ds*[ap]m)?$/;
  return dateFormat.test(value);
}

Я должен упомянуть, что это не проверяет строки, отформатированные ISO, но с немного большей работой с RegExp вам должно быть хорошо.

JavaScript, дата-формат,
Похожие вопросы