Я хотел бы сказать разницу между действительными и недействительными объектами даты в JS, но не мог понять, как:
var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'
Есть идеи для написания isValidDate
функции?
- Ash рекомендуется
Date.parse
для анализа строк даты, что дает авторитетный способ проверить, является ли строка даты действительной. - Что бы я предпочел, если это возможно, это чтобы мой API принимал экземпляр Date и мог проверять / утверждать, действителен ли он или нет. Решение Borgar делает это, но мне нужно протестировать его в разных браузерах. Мне также интересно, есть ли более элегантный способ.
- Эш заставил меня задуматься о том, чтобы мой API вообще не принимал
Date
экземпляры, это будет проще всего проверить. - Боргар предложил проверить
Date
экземпляр, а затем проверитьDate
значение времени. Если дата недействительна, значение времени равноNaN
. Я проверил с ECMA-262, и это поведение в стандарте, который именно то, что я ищу.
javascript
date
orip
источник
источник
return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
Ответы:
Вот как бы я это сделал:
Обновление [2018-05-31] : Если вас не интересуют объекты Date из других контекстов JS (внешних окон, фреймов или фреймов), эта более простая форма может оказаться предпочтительной:
источник
d.getTime
простоisNan(d)
d instanceof Date && !isNaN(d.getTime())
1
у меня все равно будет действительная дата, в результатеMon Jan 01 2001 00:00:00
которой действительно будет дата, однако для целей моего приложения она совершенно бесполезна , Таким образом, по крайней мере, в моем случае требуется дополнительная проверка ввода. Этот ответ подтверждает, аdateObject
неDate
!Вместо использования
new Date()
вы должны использовать:Date.parse()
возвращает отметку времени, целое число, представляющее количество миллисекунд с 01 января 1970 года. Он вернется,NaN
если не сможет проанализировать предоставленную строку даты.источник
Date.parse
зависит от реализации и определенно не заслуживает доверия для анализа общих строк даты. Нет единого формата, который правильно анализируется в популярных браузерах, тем более во всех используемых (хотя в конечном итоге формат ISO8601, указанный в ES5, должен быть в порядке).new Date('foo')
это в основном эквивалентноDate.parse('foo')
методу. Смотрите: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Так что, как сказал @RobG, это относится и к нему.Вы можете проверить действительность
Date
объектаd
черезЧтобы избежать проблем с кадрами, можно заменить
instanceof
проверку наВызов ,
getTime()
как в ответ Боргара нет необходимости , посколькуisNaN()
иisFinite()
как неявно преобразовать в число.источник
isFinite()
для -toString.call()
только замена дляinstanceof
части проверкиisFinite
overisNaN
(оба отлично работаютDate(Infinity)
). Кроме того, если вы хотите , состояние противоположное, это становится немного проще:if (!(date instanceof Date) || isNaN(date))
.Мое решение - просто проверить, есть ли у вас действительный объект даты:
Реализация
Применение
источник
isNaN
более явный способ проверить NaNisNaN("a") === true
, пока("a" !== "a") === false
. Об этом стоит подумать. +1new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)
, Если вы передаете строку в конструктор даты, вы должны передать стандартизированную строку, чтобы получить надежный результат. В частности, «Строка должна быть в формате, распознаваемом методом Date.parse ()». developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…кратчайший ответ, чтобы проверить действительную дату
источник
date && !isNaN(date.getTime())
date
не имеет типа Date. Например:var date = 4; date && !isNaN(date.getTime());
.date instanceof Date && !isNaN(date.getTime())
Вы можете просто использовать moment.js
Вот пример:
Раздел валидации в документации вполне понятен.
А также, следующие флаги синтаксического анализа приводят к неверной дате:
overflow
: Переполнение поля даты, например, 13-го месяца, 32-го дня месяца (или 29-го февраля для не високосных годов), 367-го дня года и т. Д. Переполнение содержит индекс недопустимой единицы соответствовать #invalidAt (см. ниже); -1 означает отсутствие переполнения.invalidMonth
: Неверное название месяца, например, момент («Март», «ММММ»); Содержит недопустимую строку месяца, либо ноль.empty
: Входная строка, которая не содержит ничего доступного для анализа, например момент («это чушь»); Boolean.Источник: http://momentjs.com/docs/
источник
moment("11/06/1986", "DD/MM/YYYY").isValid();
Хотелось бы отметить, что виджет DatePicker пользовательского интерфейса jQuery имеет очень хороший метод утилиты проверки даты, который проверяет формат и действительность (например, даты 01/33/2013 не допускаются).
Даже если вы не хотите использовать виджет datepicker на своей странице в качестве элемента пользовательского интерфейса, вы всегда можете добавить его библиотеку .js на свою страницу и затем вызвать метод validator, передав в него значение, которое вы хотите проверить. Чтобы сделать жизнь еще проще, в качестве входных данных используется строка, а не объект JavaScript Date.
Смотрите: http://api.jqueryui.com/datepicker/
Он не указан как метод, но он есть - как вспомогательная функция. Поиск на странице "parsedate", и вы найдете:
$ .datepicker.parseDate (формат, значение, настройки) - извлечение даты из строкового значения в указанном формате.
Пример использования:
(Более подробная информация о форматах даты находится на http://api.jqueryui.com/datepicker/#utility-parseDate ).
В приведенном выше примере вы не увидите предупреждающее сообщение, поскольку «01/03/2012» является датой, действующей в календаре, в указанном формате. Однако, например, если вы сделали 'stringval' равным '13/04/2013', вы получите сообщение с предупреждением, поскольку значение '13/04/2013' недействительно для календаря.
Если переданное строковое значение успешно проанализировано, значением 'testdate' будет объект даты Javascript, представляющий переданное строковое значение. Если нет, это было бы неопределенным.
источник
Мне очень понравился подход Кристофа (но мне не хватило репутации, чтобы проголосовать). Для моего использования я знаю, что у меня всегда будет объект Date, поэтому я просто расширил дату с помощью метода valid ().
Теперь я могу просто написать это, и это гораздо более наглядно, чем просто проверка isFinite в коде ...
источник
isFinite
сработал у меня отлично. Но да, бессмысленно расширять прототип.!isFinite
наDate
поймать тот факт, чтоDate
естьInvalid Date
. Также стоит отметить мой контекст внутри узла.источник
Вы можете проверить действительный формат txDate.value с этим scirpt. если он был в неправильном формате, объект Date не был создан и возвращал ноль в dt.
И как @ MiF's предложил вкратце
источник
Я использую следующий код для проверки значений года, месяца и даты.
Для деталей, обратитесь к Проверке даты в JavaScript
источник
str
не используетсяЗдесь уже слишком много сложных ответов, но достаточно простой строки (ES5):
или даже в ES6:
источник
Date.parse(true)
, я правильно получаю NaN.Я видел некоторые ответы, которые очень близко подошли к этому маленькому фрагменту.
JavaScript способ:
TypeScript способ:
источник
Отличное решение! Включено в мою библиотеку вспомогательных функций, теперь это выглядит так:
источник
Это только сработало для меня
Однако это не сработало
источник
`${new Date('foo')}` === 'Invalid Date'
Для проектов Angular.js вы можете использовать:
источник
Ни один из этих ответов не сработал для меня (проверено в Safari 6.0) при попытке проверить дату, такую как 31.02.2012, однако, они работают нормально при попытке установить любую дату больше 31.
Поэтому мне пришлось немного перебрать силу. Предполагая, что дата в формате
mm/dd/yyyy
. Я использую ответ @broox:источник
&& value.split('/')[0] == (d.getMonth()+1);
new Date('string date')
эквивалентноDate.parse('string date')
, см .: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…, так что вы можете получить ложные значения true или false.Ни одно из вышеперечисленных решений не помогло мне.
код выше будет видеть, когда JS превращает 31.02.2012 в 03.02.2012, что он недействителен
источник
источник
Я написал эту функцию. Передайте ему строковый параметр, и он будет определять, является ли это действительной датой или нет, основываясь на этом формате «дд / мм / гггг».
вот тест
ввод: "хахаха", вывод: ложь.
вход: "29/2/2000", выход: true.
вход: "29/2/2001", выход: ложь.
источник
Date.prototype.toISOString
броскиRangeError
(по крайней мере, в Chromium и Firefox) на недопустимые даты. Вы можете использовать его как средство проверки и может не понадобитьсяisValidDate
как таковое (EAFP). В противном случае это:источник
Вдохновленный подходом Боргара, я убедился, что код не только проверяет дату, но и на самом деле удостоверяется, что дата является реальной датой, то есть такие даты, как 31/09/2011 и 29/02/2011, недопустимы.
источник
dd/MM/yyyy
обозначения. Кроме того, он возвращает,true
когда он действителен, а'Invalid date!'
если нет, лучше вернуть только 1 тип.Я объединил лучшие результаты производительности, которые я нашел вокруг этой проверки, если данный объект:
Результат следующий:
источник
Объект Date to string - более простой и надежный способ определить, являются ли оба поля действительными. Например, если вы введете это «-------» в поле ввода даты. Некоторые из приведенных выше ответов не сработают.
источник
Для компонентов даты на основе int 1:
тесты:
источник
Выбранный ответ превосходен, и я тоже им пользуюсь. Однако, если вы ищете способ проверки ввода даты пользователем, вы должны знать, что объект Date очень настойчив в преобразовании того, что может показаться недопустимым аргументом конструкции, в допустимые аргументы. Следующий код модульного теста иллюстрирует эту точку:
источник
Назови это так
источник
Готовая функция, основанная на ответе с самым высоким рейтингом:
источник
Простое и элегантное решение:
источники:
[1] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c
[2] Неверная дата отображается в новой дате () в JavaScript
источник
date.getDate() == day
недостаточно, чтобы определить, является ли дата действительной. Исходный формат даты будет возвращать недопустимую дату в некоторых реализациях независимо от того, является ли дата действительной или нет. Также "1970-01-01 00:00", если проанализировано правильно, вернет false (т.е.Boolean(+new Date("1970-01-01"))
возвращает false).const date = new Date(year, month, day);
Обратите внимание, что таким образом месяц проиндексирован на 0, поэтому вам, возможно, придется вычесть один, чтобы правильно выстроить его.Я думаю, что это длительный процесс. Мы можем сократить его, как показано ниже:
источник