Ostrzeżenie o wycofaniu w Moment.js - Nie w rozpoznanym formacie ISO


176

Otrzymuję ostrzeżenie, że wartość podana do chwili nie jest w rozpoznawalnym formacie ISO. Zmieniłem dzisiaj zmienną z funkcją momentu i nadal nie działa.

Oto błąd ostrzegawczy:

Ostrzeżenie o wycofaniu: podana wartość nie jest w rozpoznawanym formacie ISO. moment konstrukcji wraca do js Date (), co nie jest niezawodne we wszystkich przeglądarkach i wersjach. Formaty daty inne niż ISO są odradzane i zostaną usunięte w przyszłej wersji głównej. Więcej informacji można znaleźć pod adresem http://momentjs.com/guides/#/warnings/js-date/ . Argumenty: [0] _isAMomentObject: true, _isUTC: true, _useUTC: true, _l: undefined, _i: 2016-9-26 19:30, _f: undefined, _strict: undefined, _locale: [object Object]

var entryDate = new Date();
var currentDate = entryDate.getDate();

function between(x, min, max) {
  return x.valueOf() >= min.valueOf() && x < max.valueOf();
}

$('#custom1').change(function () {
  if ($('#custom1 :selected').val() == 'AU') {
    var keyword = '';

    var aus1_s = moment.tz('2016-9-26 19:30', 'Australia/Sydney');
    var aus2_s = moment.tz('2016-10-2 19:30', 'Australia/Sydney');
    var aus3_s = moment.tz('2016-10-9 19:30', 'Australia/Sydney');
    var aus4_s = moment.tz('2016-10-16 19:30', 'Australia/Sydney');
    var aus5_s = moment.tz('2016-10-23 19:30', 'Australia/Sydney');
    var aus6_s = moment.tz('2016-10-30 19:30', 'Australia/Sydney');
    var aus6_e = moment.tz('2016-11-5 19:30', 'Australia/Sydney');
  } else if ($('#custom1 :selected').val() == 'NZ') {
    var aus1_s = moment.tz('2016-9-28 20:30', 'Pacific/Auckland');
    var aus2_s = moment.tz('2016-10-4 20:30', 'Pacific/Auckland');
    var aus3_s = moment.tz('2016-10-11 20:30', 'Pacific/Auckland');
    var aus4_s = moment.tz('2016-10-18 20:30', 'Pacific/Auckland');
    var aus5_s = moment.tz('2016-10-25 20:30', 'Pacific/Auckland');
    var aus6_s = moment.tz('2016-11-2 20:30', 'Pacific/Auckland');
    var aus6_e = moment.tz('2016-11-9 20:30', 'Pacific/Auckland');
  } else {
    $('#entryEquals').val('');
    return false;
  }

  var today = moment();

  switch (true) {
    case between(today, aus1_s, aus2_s):
      keyword = 'RElYT04=';
      break;

    case between(today, aus2_s, aus3_s):
      keyword = 'QlJJREU=';
      break;

    case between(today, aus3_s, aus4_s):
      keyword = 'U1lETkVZ';
      break;

    case between(today, aus4_s, aus5_s):
      keyword = 'R1JPT00=';
      break;

    case between(today, aus5_s, aus6_s):
      keyword = 'V0VERElORw==';
      break;

    case between(today, aus6_s, aus6_e):
      keyword = 'VExD';
      break;

    default:
      $('#entryEquals').val('');
      break;
  }

  $('#entryEquals').val(keyword);
});

1
Myślę, że ostrzeżenie odnosi się do '2016-9-26 19:30'i takiego nie jest rozpoznawalnym formatem ISO
Jaromanda X

jaki jest błąd w formacie? więc czy muszę dodać 0?
Jemai,

1
Możesz to zrobić moment.tz('2016-9-28 20:30', 'YYYY-M-D H:mm', 'Pacific/Auckland');zgodnie z dokumentacją ... przyjmie to 1 lub 2 cyfrowe miesiące i dni, 1 lub 2 cyfrowe godziny w formacie 24-godzinnym
Jaromanda X

2
Błąd polega na tym, że dostarczany format nie jest rozpoznawalnym formatem ISO ... albo podaj rozpoznany format ISO, albo podaj ciąg, który „podpowiada” oczekiwany format
Jaromanda X

Okej, co powiesz na ten, czy mogę też dodać ten format? var dzisiaj = moment.tz (Todaystring, $. urlParam ('t_zone'));
Jemai,

Odpowiedzi:


180

Sprawdź całą ich niesamowitą dokumentację!

Oto, gdzie omawiają przesłanie ostrzegawcze .

Ciąg + format

Ostrzeżenie: obsługa analizowania ciągów przez przeglądarkę jest niespójna. Ponieważ nie ma specyfikacji, które formaty powinny być obsługiwane, to, co działa w niektórych przeglądarkach, nie będzie działać w innych przeglądarkach.

Aby uzyskać spójne wyniki analizowania czegokolwiek innego niż ciągi ISO 8601, należy użyć ciągu + format .

moment("12-25-1995", "MM-DD-YYYY");

Ciąg + Formaty (wiele formatów)

Jeśli masz więcej niż jeden format, sprawdź ich formaty String + (z „s”).

Jeśli nie znasz dokładnego formatu ciągu wejściowego, ale wiesz, że może to być jeden z wielu, możesz użyć tablicy formatów.

moment("12-25-1995", ["MM-DD-YYYY", "YYYY-MM-DD"]);

Sprawdź dokumentację, aby uzyskać bardziej szczegółowe informacje.

Strefa czasowa

Parsowanie płatności w strefie , równoważna dokumentacja dla stref czasowych.

Konstruktor moment.tz pobiera wszystkie te same argumenty co konstruktor momentu, ale używa ostatniego argumentu jako identyfikatora strefy czasowej.

var b = moment.tz("May 12th 2014 8PM", "MMM Do YYYY hA", "America/Toronto");

EDYTOWAĆ

//...
var dateFormat = "YYYY-M-D H:m"; //<-------- This part will get rid of the warning.
var aus1_s, aus2_s, aus3_s, aus4_s, aus5_s, aus6_s, aus6_e;
if ($("#custom1 :selected").val() == "AU" ) {
    var region = 'Australia/Sydney';

    aus1_s = moment.tz('2016-9-26 19:30', dateFormat, region);              
    aus2_s = moment.tz('2016-10-2 19:30', dateFormat, region);              
    aus3_s = moment.tz('2016-10-9 19:30', dateFormat, region);                  
    aus4_s = moment.tz('2016-10-16 19:30', dateFormat, region);                 
    aus5_s = moment.tz('2016-10-23 19:30', dateFormat, region);
    aus6_s = moment.tz('2016-10-30 19:30', dateFormat, region);
    aus6_e = moment.tz('2016-11-5 19:30', dateFormat, region);
} else if ($("#custom1 :selected").val() == "NZ" ) {
    var region = 'Pacific/Auckland';

    aus1_s =  moment.tz('2016-9-28 20:30', dateFormat, region);
    aus2_s =  moment.tz('2016-10-4 20:30', dateFormat, region);
    aus3_s =  moment.tz('2016-10-11 20:30', dateFormat, region);
    aus4_s =  moment.tz('2016-10-18 20:30', dateFormat, region);
    aus5_s =  moment.tz('2016-10-25 20:30', dateFormat, region);
    aus6_s =  moment.tz('2016-11-2 20:30', dateFormat, region);
    aus6_e =  moment.tz('2016-11-9 20:30', dateFormat, region);
}
//...

89
Zamiast kopiować i wklejać dokumentację, podaj prawdziwą odpowiedź.
Rebs

2
to pomogło mi wstawić format do „input” - moment („12-25-1995”, [„MM-DD-RRRR”, „RRRR-MM-DD”]);
Demodave

2
@Rebs Myślę, że dodałem dużo dokumentacji, ponieważ ogólne rozwiązanie nie jest proste. Oczywiście konkretne rozwiązanie dla Jemai powinno być w odpowiedzi i dodałem je od tego czasu (dzięki wam!), Ale to pierwsze jest powodem, dla którego jest tu tak dużo dokumentacji.
christo8989

Dzięki, ale co, jeśli chcesz mieć prostą randkę bez tych ciężkich ram formatowania, możemy po prostu zignorować to ostrzeżenie?
Webwoman

to mi pomogło -> moment ("12-25-1995", ["MM-DD-RRRR", "RRRR-MM-DD"]);
Cesar Rodriguez T

50

Robi to dla mnie:

moment(new Date("27/04/2016")).format

5
To najprostsze obejście, aby uniknąć zanieczyszczenia konsoli
Josey

2
Nie radziłbym tego podejścia nikomu, kto ma do czynienia z obsługą IE w jakimkolwiek stopniu. Wyniki są bardzo niestabilne, zwłaszcza w IE 11.
Ajm113

1
To najprostsza i najdokładniejsza odpowiedź. Dzięki, pomogło mi.
Tahir Afridi

15

Wystąpił ten błąd, ponieważ próbowałem przekazać datę z localStorage. Przekazanie daty do nowego Dateobiektu, a następnie wywołanie .toISOString () załatwiło sprawę :

const dateFromStorage = localStorage.getItem('someDate');
const date = new Date(dateFromStorage);
const momentDate = moment(date.toISOString());

To stłumiło wszelkie ostrzeżenia w konsoli.


Spowoduje to zniesienie ostrzeżenia, ale minusem jest to, że jeśli jesteś specyficzny dla strefy czasowej, nie sugerowałbym tego: ponieważ konwertuje daną datę na UTC, jak mówimy `` .toISOString () ''. Spróbuj „moment (nowa data („ 27/04/2016 ”)). Format” zgodnie z inną odpowiedzią - co spowoduje, że czas będzie przechowywany w lokalnym ..
whoami

15

wykorzystaj moment w swojej funkcji w ten sposób

 moment(new Date(date)).format('MM/DD/YYYY')

Oto krótka odpowiedź, której szukasz, jeśli chcesz po prostu pozbyć się „zdekapitowanego ostrzeżenia”
VictorC

6

Ta odpowiedź ma na celu lepsze zrozumienie tego ostrzeżenia

Ostrzeżenie o wycofaniu pojawia się, gdy używasz momentu do utworzenia obiektu czasu, var today = moment(); .

Jeśli to ostrzeżenie jest dla Ciebie w porządku, mam prostszą metodę.

Zamiast tego nie używaj dateobiektu z jsużycia moment. Na przykład użyjmoment() aby uzyskać aktualną datę.

Lub przekonwertuj jsobiekt momentdaty na datę. Możesz to po prostu zrobić, określając format plikujs obiektu daty.

to znaczy, moment("js date", "js date format");

na przykład:

moment("2014 04 25", "YYYY MM DD");

(ALE MOŻESZ KORZYSTAĆ Z TEJ METODY TYLKO DO JEJ DEPRECYJACJI, może to być amortyzowane momentw przyszłości)


6
Poważnie! pytanie, jak usunąć to ostrzeżenie o wycofaniu! nie pytając, jak używać tego wycofania! ponadto jest to „to zostanie usunięte w przyszłości” nie ”to może być amortyzowane od chwili w przyszłości” jest już wycofane!
Al-Mothafar,

@ Al-Mothafar, mam małą wątpliwość, dlaczego wyszedłeś poza to, gdy ifstan zawiódł. Powinieneś zamknąć odpowiedź, nie kontynuować.
Saahithyan Vigneswaran

2
Dzięki, to jest odpowiedź, która naprawdę pokazała mi, co mogę tutaj wiedzieć.
DigitalDesignDj

3

Możesz użyć

moment(date,"currentFormat").format("requiredFormat");

Powinno to być używane, gdy data nie jest formatem ISO, ponieważ w chwili wskaże, jaki jest nasz obecny format.


1
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
leopal

@leopal wprowadził pewne zmiany!
BeaST 30

2

Parsowanie ciągu z momentem.js.

const date = '1231231231231' //Example String date
const parsed = moment(+date);

Pomogło mi to pozbyć się ostrzeżenia o wycofaniu, gdy próbowałem użyć formatu uniksowego, aby uzyskać numer tygodnia.
curious.netter
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.