2015 Обновление
Это старый вопрос, но другие новые вопросы, такие как:
закройте как дубликаты этого, так что я думаю, что важно добавить некоторую свежую информацию здесь. Я пишу это, потому что мне стало страшно думать, что люди на самом деле копируют и вставляют часть кода, размещенного здесь, и используют его в работе.
Большинство ответов здесь либо используют некоторые сложные регулярные выражения, которые соответствуют только некоторым очень специфическим форматам и фактически делают это неправильно (например, соответствует 32 января, но не соответствует фактической дате ISO, как объявлено - см. demo ) или они пытаются передать что-либо конструктору Date
и желают лучшего.
Использование момента
Как я объяснил в этом ответе в настоящее время есть библиотека для этого:
Moment.js
Это библиотека для анализа, проверки, манипулирования и отображения дат в JavaScript, которая имеет гораздо более богатый API, чем стандартные функции обработки дат в JavaScript.
Это миниатюрный / gzipped 12kB и работает в 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
Используя Момент, вы можете очень точно проверять действительные даты. Иногда очень важно добавить некоторые подсказки о формате, который вы ожидаете. Например, такая дата, как 22.06.2015, выглядит как действительная дата, если только вы не используете формат ДД / ММ / ГГГГ, и в этом случае эта дата должна быть отклонена как недействительная. Есть несколько способов, как вы можете сказать Моменту, какой формат вы ожидаете, например:
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 , похожий на (подмножество) Момент, но без неожиданностей, вызванных мутацией существующих объектов (см. документы для получения дополнительной информации).
2018 Обновление
Сегодня я рекомендую использовать Luxon для манипуляции с датой / временем вместо Moment, что (в отличие от Moment) делает все объекты неизменяемыми, поэтому нет никаких неприятных сюрпризов, связанных с неявной мутацией дат.
Подробнее
Смотри также:
Серия статей Роба Гравелла о библиотеках разбора дат в JavaScript:
Итог
Конечно, любой может попытаться заново изобрести колесо, написать регулярное выражение (но , пожалуйста, перед прочтением прочитайте ISO 8601 и RFC 3339) или вызвать встроенные конструкторы со случайными данными для разбора ошибки. сообщения типа 'Invalid Date'
(Вы уверены, что это сообщение точно такое же на всех платформах? Во всех локалях? В будущем?) или вы можете использовать проверенное решение и использовать ваши время, чтобы улучшить его, а не изобретать его. Все перечисленные здесь библиотеки являются свободным программным обеспечением с открытым исходным кодом.