Sprawdź, czy data jest prawidłowa

124

Oto scenariusz:

Mam Stringinny format daty i inny. Np .:
data: 2016-10-19
dateFormat: „DD-MM-RRRR”.

Muszę sprawdzić, czy ta data jest prawidłowa.

Próbowałem następujących rzeczy

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

d.isValid()powraca za falsekażdym razem. Czy Moment.js nie analizuje daty w podanym formacie?

Następnie próbowałem DD-MM-YYYYnajpierw sformatować datę, a następnie przekazać ją do Moment.js:

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

Teraz date.isValid()daje mi pożądany efekt, ale tutaj obiekt daty Moment.js jest tworzony dwukrotnie. Jak mogę tego uniknąć? Czy jest lepsze rozwiązanie?

FYI, nie wolno mi zmieniać dateFormat.

Ganesh
źródło
Czy nie możesz zmienić wartości dateFormat? W takim przypadku będziesz musiał zmienić format danych wejściowych, ponieważ 2016-10-19 to RRRR-MM-DD, a nie DD-MM-RRRR. Co możesz zmienić?
Pochen
Dane wejściowe pochodzą z selektora dat. Tego też nie mogę zmienić :(
Ganesh
1
Czy mogę zapytać, dlaczego nie możesz zmienić zmiennej dateFormat? var d = moment („19-10-2016”, „DD-MM-RRRR”); rozwiąże twoje problemy, jeśli o mnie chodzi
Pochen
naprawdę nie mogę powiedzieć. Ale nie mam wpływu na zmianę tej wartości.
Ganesh

Odpowiedzi:

186

Był w stanie znaleźć rozwiązanie. Ponieważ data, którą otrzymuję, jest w formacie ISO, tylko podanie daty do chwili ją zweryfikuje, nie ma potrzeby przekazywania dateFormat.

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

A następnie date.isValid()daje pożądany efekt.

Ganesh
źródło
15
Czy ktoś wie, jaka jest obecnie preferowana metoda? Ta metoda generuje teraz następujące „Ostrzeżenie o wycofaniu”: konstrukcja momentu wraca do js Date. Jest to odradzane i zostanie usunięte w nadchodzącej wersji głównej. Proszę odnieść się do github.com/moment/moment/issues/1407 aby uzyskać więcej informacji.
Andrew,
4
Tylko ostrzeżenie, że to nie zawsze działa: var a = moment('12345'); a.isValid() // is trueTo się nie udaje, ponieważ moment wróci do domyślnego obiektu daty, jeśli nie może przeanalizować daty. A domyślny obiekt daty zawsze zwróci datę (ale nie taką, którą chcesz).
Mauvis Ledford,
1
trzeba to dodać moment('02').isValid() === true, więc możesz być ostrożny
Bruno Finger
3
Równieżmoment('abcde 1').isValid() === true
Amiram Korach
119

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

Podczas wywoływania należy dodać trzeci argument, momentktóry wymusza ścisłe analizowanie. Oto odpowiednia część aktualnej dokumentacji http://momentjs.com/docs/#/parsing/string-format/ Jest blisko końca tej sekcji.

schutta
źródło
Nie ma to żadnego skutku.
Billal Begueradj
ta odpowiedź powinna być poprawną odpowiedzią ........ @ Begueradj to ma wpływ, spróbuj użyć różnych wartości, czasem poprawnych, a czasem złych
Akki
A o ścisłym parsowaniu możesz przeczytać tutaj
kuhr
Pozwoli ci to wprowadzić 0000 jako rok
eddy
17

Proszę bardzo: Working Fidddle

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});
gschambial
źródło
Tak jak powiedziałem, format daty to „DD-MM-RRRR” i nie wolno mi go zmieniać.
Ganesh
Rozumiem. Pokaż mi to.
gschambial
Czy można tutaj zmienić ciąg daty 2016-10-19?
gschambial
Nie. To pochodzi z selektora dat
Ganesh
1
Czy nie możesz go zmodyfikować po tym, jak pochodzi z DatePicker, a przed wprowadzeniem go do var d = moment("2016-10-19",dateFormat);?
gschambial
14

Używam moment wraz z nową datą do obsługi przypadków undefinedwartości danych:

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

z powodu: moment(undefined).isValid() == true

gdzie jako lepszy sposób: moment(new Date(undefined)).isValid() == false

wakeupoj
źródło
12

Właśnie znalazłem naprawdę pokręconą sprawę.

moment('Decimal128', 'YYYY-MM-DD').isValid() // true
Sam Araiza
źródło
15
moment('Decimal128', 'YYYY-MM-DD', true).isValid() // false. Użyj trybu ścisłego :) momentjs.com/guides/#/parsing/strict-mode
jklemmack
9

Jak sprawdzić, czy ciąg jest prawidłową datą za pomocą Moment, gdy data i format daty są różne

Przepraszam, ale czy któreś z podanych rozwiązań w tym wątku faktycznie odpowiadało na zadane pytanie?

Mam datę typu String i inny format daty. Np .: data: 2016-10-19 dateFormat: „DD-MM-RRRR”. Muszę sprawdzić, czy ta data jest prawidłowa.

Poniższe działa dla mnie ...

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.

Ale szczerze, nie rozumiem dlaczego moment.isDate()( zgodnie z dokumentacją ) akceptuje tylko przedmiot. Moim zdaniem powinien również obsługiwać string.

tfmontague
źródło
2
jeśli przekażemy prawdę jako trzeci argument na chwilę, sprawdza dokładny format daty.
Raj Kumar 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
Sande
źródło
czy możesz dodać wyjaśnienie do swojej odpowiedzi? Jaką dodatkową wartość wnosi to do już istniejącej i zaakceptowanej odpowiedzi?
slfan
0

Jeśli data jest prawidłowa, to getTime()będzie zawsze sobie równa.

var date = new Date('2019-12-12');
if(date.getTime() - date.getTime() === 0) {
    console.log('Date is valid');
} else {
    console.log('Date is invalid');
}
Tanzeem Bhatti
źródło
-2

Spróbuj tego. To nie jest miłe, ale będzie działać, o ile dane wejściowe mają stały format z selektora dat.

W tym przykładzie jest zła data pochodząca z twojego selektora

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
źródło
1
Proszę, nie rób tego.
tdelam