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

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

У меня есть дата String и формат даты, который отличается. Напр.:
дата: 2016-10-19
dateFormat: "DD-MM-YYYY".

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

Я пробовал следующие вещи

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 создается дважды. Как я могу избежать этого? Есть ли лучшее решение?

FYI Мне не разрешено менять dateFormat.

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Вот вы: Работая Fidddle

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

Я только что нашел действительно испорченный случай.

moment('Decimal128', 'YYYY-MM-DD').isValid() // true

Ответ 7

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

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

У меня есть строковая дата и формат даты, который отличается. Напр.: дата: 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() (как задокументировано) принимает только объект. Также должен поддерживать строку на мой взгляд.

Ответ 8

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

Это 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
}