Оновлення 2015 року
Це старе питання, але інші нові питання, такі як:
закрити як копії цього, тому я думаю, що тут важливо додати свіжу інформацію. Я пишу це, бо злякався, думаючи, що люди насправді копіюють і вставляють частину коду, розміщеного тут, і використовують його у виробництві.
Більшість відповідей тут або використовують деякі складні регулярні вирази, які відповідають лише деяким дуже специфічним форматам, і насправді роблять це неправильно (наприклад, відповідність 32 січня, не відповідаючи фактичній даті ISO, як рекламується - див. Демонстрацію ), або намагаються передати що-небудьDate
конструктору та побажати найкращого.
Використання моменту
Як я пояснив у цій відповіді , зараз для цього доступна бібліотека:
Moment.js
Це бібліотека для аналізу, валідації, маніпулювання та відображення дат у JavaScript, яка має набагато багатший API, ніж стандартні функції обробки дат JavaScript.
Це 12kB мінімізований / 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
Використовуючи Момент, ви можете бути дуже конкретними щодо перевірки дійсних дат. Іноді дуже важливо додати підказки щодо формату, який ви очікуєте. Наприклад, така дата, як 22.06.2015, виглядає як дійсна дата, якщо ви не використовуєте формат DD / MM / РРРР, у цьому випадку цю дату слід відхилити як недійсну. Є кілька способів, як ви можете сказати Моменту, який формат очікуєте, наприклад:
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 року
Я створив модуль безсмертника, який нагадує (підмножину) Моменту, але без сюрпризів, викликаних мутацією існуючих об'єктів (див . Документи для отримання додаткової інформації).
Оновлення 2018 року
Сьогодні я рекомендую використовувати Люксон для маніпуляції датою / часом замість Моменту, який (на відміну від Моменту) робить увесь об’єкт непорушним, тому немає неприємних сюрпризів, пов'язаних із неявною мутацією дат.
Більше інформації
Дивитися також:
Серія статей Роб Гравель про бібліотеки розбору дат JavaScript:
Нижня лінія
Звичайно, кожен може спробувати винайти колесо, написати регулярний вираз (але, будь ласка, прочитайте ISO 8601 та RFC 3339, перш ніж це зробити) або зателефонувати до вбудовуваних конструкторів із випадковими даними, щоб проаналізувати повідомлення про помилки на кшталт 'Invalid Date'
(Ви впевнені, що це повідомлення точно так само на всіх платформах? У всіх локалях? Надалі?) або ви можете скористатися випробуваним рішенням і використати свій час для його вдосконалення, а не заново винаходити. Усі перераховані тут бібліотеки є відкритим кодом, вільним програмним забезпеченням.