Какой простой способ проверить, является ли значение допустимой датой, разрешен любой известный формат даты.
Например , я имею значение 10-11-2009
, 10/11/2009
, 2009-11-10T07:00:00+0000
которые все должны быть признаны в качестве значения даты, а значения 200
, 10
, 350
, , которые не должны быть признаны в качестве значения даты. Какой самый простой способ проверить это, если это вообще возможно? Потому что отметки времени также будут разрешены.
javascript
date-format
Thizzer
источник
источник
Ответы:
Хватило бы
Date.parse()
?См. Относительную страницу документации MDN .
источник
Date.parse("4.3")
есть986270400000
.Обновление 2015
Это старый вопрос, но другие новые вопросы, такие как:
закройте как дубликаты этого, так что я думаю, что важно добавить некоторую свежую информацию здесь. Я пишу это, потому что мне стало страшно думать, что люди на самом деле копируют и вставляют часть кода, размещенного здесь, и используют его в производстве.
Большинство ответов здесь либо используют некоторые сложные регулярные выражения, которые соответствуют только некоторым очень специфическим форматам и фактически делают это неправильно (например, соответствуют 32 января, но не соответствуют фактической дате ISO, как объявлено - см. Демонстрацию ), либо они пытаются передать что-либо
Date
конструктору и желаю лучшегоИспользуя момент
Как я объяснил в этом ответе, в настоящее время есть библиотека для этого: Moment.js
Это библиотека для анализа, проверки, манипулирования и отображения дат в JavaScript, которая имеет гораздо более богатый API, чем стандартные функции обработки дат в JavaScript.
Это миниатюрный / gzipped 12kB и работает в Node.js и других местах:
Используя момент, вы можете быть очень точными в проверке действительных дат. Иногда очень важно добавить некоторые подсказки о формате, который вы ожидаете. Например, такая дата, как 22.06.2015, выглядит как действительная дата, если вы не используете формат ДД / ММ / ГГГГ, и в этом случае эта дата должна быть отклонена как недействительная. Есть несколько способов, как вы можете сказать Момент, какой формат вы ожидаете, например:
true
Аргумент есть поэтому момент не будет пытаться разобрать вход , если он не точно соответствовать одному из форматов , предоставляемых (это должно быть поведение по умолчанию , на мой взгляд).Вы можете использовать внутренний формат:
И вы можете использовать несколько форматов в качестве массива:
Смотрите: ДЕМО .
Другие библиотеки
Если вы не хотите использовать Moment.js, есть и другие библиотеки:
Обновление 2016
Я создал модуль immoment, который похож на (подмножество) Момент, но без неожиданностей, вызванных мутацией существующих объектов (см. Документацию ).
2018 Обновление
Сегодня я рекомендую использовать Luxon для манипуляции с датой / временем вместо Moment, что (в отличие от Moment) делает все объекты неизменяемыми, поэтому нет никаких неприятных сюрпризов, связанных с неявной мутацией дат.
Больше информации
Смотрите также:
Серия статей Роба Гравелла о библиотеках разбора дат в JavaScript:
Нижняя граница
Конечно, любой может попытаться заново изобрести колесо, написать регулярное выражение (но, пожалуйста, прочитайте ISO 8601 и RFC 3339, прежде чем делать это) или вызвать встроенные конструкторы со случайными данными, чтобы проанализировать сообщения об ошибках, такие как
'Invalid Date'
(Вы уверены, что это сообщение точно так же на всех платформах? Во всех локалях? В будущем?) или вы можете использовать проверенное решение и использовать свое время для его улучшения, а не изобретать его заново. Все библиотеки, перечисленные здесь, с открытым исходным кодом, бесплатное программное обеспечение.источник
moment("whatever 123").isValid()
возвращаетсяtrue
.moment("06/22/2015", "DD/MM/YYYY", true).isValid();
с явно заданным форматом даты и с аргументом,true
означающим строгую проверку. Я обновил свой ответ, добавив больше информации и лучших примеров.Вот как я решил эту проблему в приложении, над которым я сейчас работаю:
обновляется на основе отзывов крильгара:
источник
new Date(date)
не выдает «Неверная дата».new Date(date) !== "Invalid Date"
будет возвращать true, поскольку левое выражение будет возвращать объект Date со значением времени NaN , которое никогда не может быть строкой. Использование «работает» из-за преобразования типов. Но так как синтаксический анализ строк даты все еще в значительной степени зависит от реализации, мы полагаем, что анализ синтаксиса произвольных форматов имеет серьезные недостатки.===
==
isDate('Mac OS X 10.14.2')
возвращает истину здесь.new Date(date) === 'Invalid Date'
работает только в Firefox и Chrome. IE8 (тот, который у меня есть на моей машине для тестирования) дает NaN.Как было заявлено на принятый ответ,
Date.parse(date)
также будет работать на номера. Таким образом, чтобы обойти это, вы также можете проверить, что это не число (если вы хотите это подтвердить).источник
isNan
это не функция; неправильный регистр в первой инстанции.date
это такFoostreet 1
, ваше состояние оценивается как истинное.Как насчет этого? Он проверит, является ли это объектом Date или строкой даты:
Я должен отметить, что это не проверяет строки, отформатированные в ISO, но с небольшим количеством работы с RegExp вы должны быть хорошими.
источник
Ни один из ответов здесь не касается проверки, является ли дата недействительной, например, 31 февраля. Эта функция решает эту проблему, проверяя, равен ли возвращаемый месяц исходному месяцу, и проверяя, чтобы был представлен действительный год.
источник
Используйте регулярное выражение для проверки.
источник
Ссылаясь на все вышеупомянутые комментарии, я пришел к решению.
Это работает, если
Date
передано в формате ISO или необходимо манипулировать для других форматов.Вы можете играть здесь на JSFiddle.
источник
YYYY-MM-DD
, поэтому присоединитьT00:00:00.000Z
и использовать это решение тривиально, чтобы проверить правильность строк.Вот улучшенная функция, которая использует только
Date.parse()
:Примечание: Date.parse () будет анализировать числа: например
Date.parse(1)
, вернет дату. Итак, здесь мы проверяем,s
не является ли число, если это дата.источник
Я бы сделал это
Играть здесь
источник
EXAMPLE STRING 12345
и она возвращает «Действительная дата».Вот минималистская версия.
источник
isDate(" 1")
Эта вызываемая функция работает отлично, возвращает true для правильной даты. Обязательно звоните, используя дату в формате ISO (гггг-мм-дд или гггг / мм / дд):
источник
return !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
Я знаю, что это старый вопрос, но я столкнулся с той же проблемой и увидел, что ни один из ответов не работал должным образом - в частности, отсеивание чисел (1200 345 и т. Д.) Из дат, что является первоначальным вопросом. Вот довольно необычный метод, о котором я мог подумать, и он, кажется, работает. Пожалуйста, укажите, есть ли случаи, когда это не удастся.
Это строка для отсеивания чисел. Таким образом, вся функция может выглядеть так:
источник
console.log("hello 1 ", isDate("hello 1 "));
возвращается истинаМожно ли проверить, доступна ли функция, связанная с датой, для объекта, чтобы определить, является ли он объектом Date или нет?
лайк
источник
Вот как я это делаю. Это не будет охватывать все форматы. Вы должны настроить соответственно. У меня есть контроль над форматом, поэтому он работает для меня
источник
Хорошо, это старый вопрос, но я нашел другое решение при проверке решений здесь. Для меня работает проверить, присутствует ли функция getTime () на объекте date:
источник
Облегченная библиотека готова для вас: Day.js
источник
По умолчанию установлено значение TRUE. Так что даже строки неправильного формата возвращают хорошие значения.
Я использовал это примерно так:
источник
Попробуй это:
источник