Проверить, действительна ли дата


124

Ниже приводится сценарий:

У меня Stringдата и формат даты разные. Пример:
date: 2016-10-19
dateFormat: «ДД-ММ-ГГГГ».

Мне нужно проверить, действительна ли эта дата.

Я пробовал следить за вещами

var d = moment("2016-10-19",dateFormat);

d.isValid()возвращается falseкаждый раз. Разве Moment.js не анализирует дату в заданном формате?

Затем я попытался DD-MM-YYYYсначала отформатировать дату, а затем передать ее в Moment.js:

var d = moment("2016-10-19").format(dateFormat);
var date = moment(d, dateFormat);

Теперь date.isValid()дает мне желаемый результат, но здесь объект даты Moment.js создается дважды. Как мне этого избежать? Есть ли лучшее решение?

К вашему сведению, мне не разрешено изменять dateFormat.


Разве вам не разрешено изменять значение dateFormat? В этом случае вам придется изменить формат ввода, поскольку 2016-10-19 - это ГГГГ-ММ-ДД, а не ДД-ММ-ГГГГ. Что вам разрешено менять?
Почен

Вход поступает из средства выбора даты. Ничего не могу изменить :(
Ганеш

1
Могу я спросить, почему вам не разрешено изменять переменную dateFormat? var d = moment ("19-10-2016", "ДД-ММ-ГГГГ"); решит ваши проблемы, насколько я понимаю
Почен

действительно не могу сказать. Но я не могу изменить это значение.
Ганеш

Ответы:


186

Смогла найти решение. Поскольку дата, которую я получаю, находится в формате ISO, ее будет подтверждать только указание даты до момента, нет необходимости передавать dateFormat.

var date = moment("2016-10-19");

И тогда date.isValid()дает желаемый результат.


15
Кто-нибудь знает, какой сейчас предпочтительный метод? Этот метод теперь выдает следующее «предупреждение об устаревании»: конструкция момента возвращается к js Date. Это не рекомендуется и будет удалено в следующем крупном выпуске. Пожалуйста, обратитесь к github.com/moment/moment/issues/1407 для получения дополнительной информации.
Эндрю

1
@Andrew, пожалуйста, посмотрите stackoverflow.com/questions/23263380/… , github.com/moment/moment/issues/2535
Ганеш

4
Просто предупреждаем, что это не всегда работает: var a = moment('12345'); a.isValid() // is trueэто не удается, потому что момент вернется к объекту даты по умолчанию, если он не может проанализировать дату. И объект даты по умолчанию всегда будет возвращать дату (только не ту, которую вы хотите.)
Мовис Ледфорд

1
нужно добавить это moment('02').isValid() === true, так что вы можете быть осторожны с этим
Бруно Фингер

3
Такжеmoment('abcde 1').isValid() === true
Амирам Корах

119

var date = moment('2016-10-19', 'DD-MM-YYYY', true);

Вы должны добавить третий аргумент при вызове, momentкоторый обеспечивает строгий синтаксический анализ. Вот соответствующая часть текущей документации http://momentjs.com/docs/#/parsing/string-format/ Это ближе к концу раздела.


Это не имеет никакого эффекта.
Billal Begueradj

этот ответ должен быть правильным ........ @ Begueradj, это имеет эффект, попробуйте использовать разные значения, иногда правильные, а иногда неправильные
Akki

А про строгий парсинг можно прочитать здесь
kuhr

Это позволит вам ввести 0000 как год
Эдди

17

Вот и все: рабочая скрипка

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});

Как я уже сказал, формат даты - «ДД-ММ-ГГГГ», и мне не разрешено его изменять.
Ганеш

О, я вижу. Дай мне посмотреть на это.
gschambial

Можно ли здесь изменить строку даты 2016-10-19?
gschambial

Нет. Это исходит из выбора даты
Ганеш

1
Разве вы не можете изменить его после того, как он поступит из datepicker и до того, как вы его введете var d = moment("2016-10-19",dateFormat);?
gschambial

14

Я использую момент вместе с новой датой для обработки случаев undefinedзначений данных:

const date = moment(new Date("2016-10-19"));

из-за: moment(undefined).isValid() == true

где как лучше: moment(new Date(undefined)).isValid() == false



9

Как проверить, является ли строка действительной датой с помощью Moment, когда дата и формат даты различаются

Извините, но действительно ли какое-либо из решений в этой ветке отвечает на заданный вопрос?

У меня есть строковая дата и другой формат даты. Пример: date: 2016-10-19 dateFormat: «ДД-ММ-ГГГГ». Мне нужно проверить, действительна ли эта дата.

Следующее работает для меня ...

const date = '2016-10-19';
const dateFormat = 'DD-MM-YYYY';
const toDateFormat = moment(new Date(date)).format(dateFormat);
moment(toDateFormat, dateFormat, true).isValid();

// Note: `new Date()` circumvents the warning that
// Moment throws (https://momentjs.com/guides/#/warnings/js-date/),
// but may not be optimal.

Но, честно говоря, не понимаю, почему moment.isDate()( как описано в документации ) принимает только объект. На мой взгляд, должен также поддерживать строку.


2
если мы передадим истину в качестве третьего аргумента для момента, он проверит точный формат даты.
Радж Кумар Н,

2
console.log(` moment('2019-09-01', 'YYYY-MM-DD').isValid()?  ` +moment('2019-09-01', 'YYYY-MM-DD').isValid())
console.log(` moment('2019-22-01', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-01', 'YYYY-DD-MM').isValid())
console.log(` moment('2019-22-22', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-22', 'YYYY-DD-MM').isValid())
console.log(` moment('undefined', 'YYYY-DD-MM').isValid()?  ` +moment('undefined', 'YYYY-DD-MM').isValid())

 moment('2019-09-01', 'YYYY-MM-DD').isValid()?  true
 moment('2019-22-01', 'YYYY-DD-MM').isValid()?  true
 moment('2019-22-22', 'YYYY-DD-MM').isValid()?  false
 moment('undefined', 'YYYY-DD-MM').isValid()?  false

не могли бы вы добавить пояснения к своему ответу? Какую дополнительную ценность это добавляет к уже существующему и принятому ответу?
slfan

0

Если дата действительна, то getTime()всегда будет равно самому себе.

var date = new Date('2019-12-12');
if(date.getTime() - date.getTime() === 0) {
    console.log('Date is valid');
} else {
    console.log('Date is invalid');
}

-2

Попробуй это. Это нехорошо, но это будет работать до тех пор, пока ввод будет в постоянном формате с помощью средства выбора даты.

В этом примере это badDate, исходящий от вашего сборщика

https://jsfiddle.net/xs8tvox9/

var dateFormat = 'DD-MM-YYYY'
var badDate = "2016-10-19";

var splittedDate = badDate.split('-');

if (splittedDate.length == 3) {
  var d = moment(splittedDate[2]+"-"+splittedDate[1]+"-"+splittedDate[0], dateFormat);
  alert(d.isValid())
} else {
  //incorrectFormat
}

1
Пожалуйста, не делай этого.
tdelam
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.