Перевірте, чи дата є дійсною


124

Далі йде сценарій:

У мене є Stringдата та формат дати, який відрізняється. Напр .:
дата: 2016-10-19
датаФормат: "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.


Вам заборонено змінювати значення dateFormat? У такому випадку вам доведеться змінити формат введення, оскільки 2016-10-19 - це РРР-ММ-ДД, а не ДД-ММ-РРРР. Що ви можете змінити?
Почен

Вхід надходить із вибору дати. Не можу також змінити це :(
Ганеш,

1
Чи можу я запитати, чому вам заборонено змінювати змінну dateFormat? var d = момент ("19-10-2016", "DD-MM-YYYY");
Вирішили

дійсно не можу сказати. Але це не в моєму контролі, щоб змінити це значення.
Ганеш

Відповіді:


185

Вдалося знайти рішення. Оскільки дата, яку я отримую, знаходиться у форматі ISO, лише надаючи дату до моменту, вона підтвердить її, не потрібно передавати дату Формат.

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

А потім date.isValid()дає бажаний результат.


15
Хтось знає, який зараз є бажаний метод? Цей метод тепер кидає таке "попередження про депрекацію": момент побудови повертається до js Date. Це не рекомендується та буде видалено в майбутньому великому випуску. Для отримання додаткової інформації зверніться до github.com/moment/moment/isissue/1407 .
Андрій

1
Будь ласка , подивіться @ Андрій на stackoverflow.com/questions/23263380 / ... , github.com/moment/moment/issues/2535
Ganesh

4
Всього голови вгору , що це не завжди працює: var a = moment('12345'); a.isValid() // is trueЦе зазнає невдачі , тому момент повернеться до об'єкту дати по замовчуванням , якщо він не може розібрати дату. А об’єкт дати за замовчуванням завжди поверне дату (тільки не ту, яку ви хочете.)
Mauvis Ledford

1
Вам потрібно додати це moment('02').isValid() === true, щоб ви могли бути обережнішими з цим
Бруно Фінгер

3
Крімmoment('abcde 1').isValid() === true
Amiram Корів

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

Ось вам: Робота Fidddle

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

Як я вже сказав, формою дати є "DD-MM-YYYY", і мені заборонено змінювати її.
Ганеш

О Я бачу. Дозвольте мені побачити на цьому.
gschambial

Чи дозволяється тут змінювати рядок дати 2016-10-19?
gschambial

Ні. Це іде від вибору дат
Ганеш

1
Ви не можете змінити його після того, як він надходить із засобу вибору дати та перед тим, як ввести його 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



8

Як перевірити, чи є рядок дійсною датою за допомогою Моменту, коли дата та формат дати відрізняються

Вибачте, але чи відповів якийсь із наведених рішень на цій темі відповідь на запитання?

У мене дата рядка та формат дати, який відрізняється. Напр .: дата: 2016-10-19 датаФормат: "DD-MM-YYYY". Мені потрібно перевірити, чи є ця дата дійсною.

Наступні роботи для мене ...

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()( як це зафіксовано ) приймає лише предмет. Повинна також підтримувати рядок на мою думку.


1
якщо ми передаємо true як третій аргумент на даний момент, він перевіряє точний формат дати.
Радж Кумар N

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

Спробуйте це. Це не приємно, але воно буде працювати до тих пір, поки введення буде постійним форматом у вашому виборі дат.

У цьому прикладі погано дати, що надходить від вашого вибору

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.