Было бы Date
достаточно?
См. Его относительную страницу документации MDN .
Что является простым способом проверить, является ли значение действительным 10-11-2009, любой известный формат даты разрешен.
Например , у меня есть значения 10/11/2009
, 2009-11-10T07:00:00+0000
, 200
которые все должны быть признаны в качестве значения даты, и значений 10
, 350
, Date.parse()
, , которые не должны быть признаны в качестве значения даты. Каков самый простой способ проверить это, если это возможно? Потому что временные метки также будут разрешены.
Было бы Date
достаточно?
См. Его относительную страницу документации MDN .
Это старый вопрос, но другие новые вопросы:
закройте их как дубликаты, поэтому я думаю, что здесь важно добавить новую информацию. Я пишу это, потому что я испугался, думая, что люди действительно копируют и вставляют часть кода, размещенного здесь, и используют его в производстве.
Большинство ответов здесь либо используют некоторые сложные регулярные выражения, которые соответствуют только некоторым очень конкретным форматам, и на самом деле делают это неправильно (например, сопоставляя 32 января, не сопоставляя фактическую дату ISO, как рекламируется - см. Демонстрацию ), или они пытаются передать что-либо Date
конструктору и желаем лучшего.
Как я объяснил в этом ответе, в настоящее время для этого доступна библиотека: 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, есть и другие библиотеки:
Я создал модуль immoment , подобный (подмножество) Moment, но без сюрпризов, вызванных мутацией существующих объектов (подробнее см. В документах ).
Сегодня я рекомендую использовать 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;
}
....
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 */
}
Как насчет чего-то подобного? Он будет проверять, является ли это объектом 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 вам должно быть хорошо.