Проверьте, действительна ли дата
Ниже приведен сценарий:
У меня есть дата 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
}