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.


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.


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.


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());
});

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



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.


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

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');
}

-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
}

1
Proszę, nie rób tego.
tdelam
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.