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