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

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.

Ganesh
источник
Разве вам не разрешено изменять значение dateFormat? В этом случае вам придется изменить формат ввода, поскольку 2016-10-19 - это ГГГГ-ММ-ДД, а не ДД-ММ-ГГГГ. Что вам разрешено менять?
Почен
Вход поступает из средства выбора даты. Ничего не могу изменить :(
Ганеш
1
Могу я спросить, почему вам не разрешено изменять переменную dateFormat? var d = moment ("19-10-2016", "ДД-ММ-ГГГГ"); решит ваши проблемы, насколько я понимаю
Почен
действительно не могу сказать. Но я не могу изменить это значение.
Ганеш

Ответы:

186

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

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

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

Ganesh
источник
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/ Это ближе к концу раздела.

schutta
источник
Это не имеет никакого эффекта.
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
источник
Как я уже сказал, формат даты - «ДД-ММ-ГГГГ», и мне не разрешено его изменять.
Ганеш
О, я вижу. Дай мне посмотреть на это.
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

wakeupoj
источник
12

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

moment('Decimal128', 'YYYY-MM-DD').isValid() // true
Сэм Арайза
источник
15
moment('Decimal128', 'YYYY-MM-DD', true).isValid() // false, Используйте строгий режим :) momentjs.com/guides/#/parsing/strict-mode
jklemmack
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()( как описано в документации ) принимает только объект. На мой взгляд, должен также поддерживать строку.

tfmontague
источник
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
}
Pochen
источник
1
Пожалуйста, не делай этого.
tdelam