„Ostrzeżenie o wycofaniu: konstrukcja momentu wraca do daty js” podczas próby przekonwertowania daty RFC2822 w moment.js

164

Używam następującego kodu, aby przekonwertować datę po stronie serwera na czas lokalny przy użyciu momentu.js.

 moment(moment('Wed, 23 Apr 2014 09:54:51 +0000').format('lll')).fromNow()

Ale dostaję:

Ostrzeżenie o wycofaniu: w momencie konstrukcja wraca do js Date. Jest to odradzane i zostanie usunięte w nadchodzącej wersji głównej. Więcej informacji można znaleźć pod adresem https://github.com/moment/moment/issues/1407 .

Wygląda na to, że nie mogę się tego pozbyć! Jak mogę to naprawić?

dariush
źródło
czy czytałeś, gdzie jest to nakazane?
toesslab
7
Oczywiście, że czytam !! ale albo jestem zdezorientowany i nie mogłem znaleźć żadnego rozwiązania, albo w ogóle nie było rozwiązania!
dariush
Po przeczytaniu tam trochę wydaje się, że jest to prawdziwy problem, o którym mówiliśmy kilka miesięcy temu ... Weź inne narzędzie ...
toesslab

Odpowiedzi:

315

Aby pozbyć się ostrzeżenia, musisz:

  • Przekaż wersję ciągu daty w formacie ISO:

    moment('2014-04-23T09:54:51');

  • Przekaż ciąg, który masz teraz, ale powiedz Momentowi, w jakim formacie jest łańcuch:

    moment('Wed, 23 Apr 2014 09:54:51 +0000', 'ddd, DD MMM YYYY HH:mm:ss ZZ');

  • Przekonwertuj swój ciąg na obiekt Date JavaScript, a następnie przekaż go do Moment:

    moment(new Date('Wed, 23 Apr 2014 09:54:51 +0000'));

Ostatnią opcją jest wbudowane rozwiązanie awaryjne, które na razie obsługuje Moment, z ostrzeżeniem o nieaktualnej konsoli. Mówią, że nie będą obsługiwać tego rozwiązania awaryjnego w przyszłych wersjach. Wyjaśniają, że używanie new Date('my date')jest zbyt nieprzewidywalne.

Joe Wilson
źródło
36
Jakikolwiek tekst w punktach w powyższej odpowiedzi byłby znacznie lepszym ostrzeżeniem o wycofaniu, niż mylący, który rozpoczął to pytanie.
Will
2
Czy używanie jest moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());prawidłowe? A może po prostu tłumię problem gotowy do cichego załamania się w najbliższej przyszłości?
Bruno Finger
Możesz również otrzymać ten komunikat, jeśli przekazana wartość zawiera początkowe lub końcowe znaki dodatkowe, takie jak spacje. Zwykle idzie z Invalidwynikiem daty.
Guillaume Renoult
@BrunoFinger to powinno działać. Date () i toISOString () to rzeczy JavaScript, a nie rzeczy Moment.
Joe Wilson
Jeśli nie masz wyboru sposobu podawania daty, polecam drugi punkt, określający format daty String. Usuwa większość niejednoznaczności.
Joshua Pinter,
50

Alternatywnie możesz wyłączyć wyświetlanie ostrzeżenia o wycofaniu, ustawiając moment.suppressDeprecationWarnings = true;

niutech
źródło
W przypadku TypeScript może być konieczne poprzedzenie tego wyrażeniem // @ts-ignore(przynajmniej w przypadku niektórych wersji strefy czasowej i @ types / moment-timezone).
TrueWill
7

Konstrukcja daty w momentwewnętrznie używa new Date()znaku w javascript. new Date()Budowa rozpoznaje ciąg dat w obu dokument RFC2822 lub ISO formatów we wszystkich przeglądarkach. Podczas konstruowania plikumoment obiektu z datą spoza tych formatów generowane jest ostrzeżenie o wycofaniu.

Chociaż generowane są ostrzeżenia o wycofaniu, w przypadku niektórych formatów momentobiekt zostanie pomyślnie utworzony w przeglądarce Chrome, ale nie w przeglądarce Firefox lub Safari. Z tego powodu przetwarzanie daty w Chrome może dawać wyniki zgodnie z oczekiwaniami (nie zawsze) i rzucać Invalid Datew inne.

Rozważ 02.02.2018,

Chrome - moment("02.02.2018")._d->Fri Feb 02 2018 00:00:00 GMT+0530 (India Standard Time)

Firefox - moment("02.02.2018")._d->Invalid Date

Safari - moment("02.02.2018")._d->Invalid Date

Więc moment.jsjest używany na własne ryzyko w przypadku, gdy nie są używane zalecane / standardowe formaty.

Aby pominąć ostrzeżenia o wycofaniu ,

  1. Jak sugerował @Joe Wilson w poprzedniej odpowiedzi, podaj format daty na momentbudowie.

Przykład: moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");

  1. Podaj datę w formacie ISO lub RFC2822.

Przykład: moment("2018-02-01T18:30:00.000Z")- Format ISO

moment("Thu, 01 Feb 2018 18:30:00 GMT")- Format RFC2822 - Formatuj w serwisie Github

  1. Zgodnie z sugestią @niutech w poprzedniej odpowiedzi ustaw

moment.suppressDeprecationWarnings = true;

  1. Proponuję za chwilę nadpisać rezerwę wejścia.

    moment.createFromInputFallback=function (config){
        config._d = new Date(config._i);
    }

Ponieważ (3) pominie wszystkie ostrzeżenia, (4) pominie tylko rezerwę konstrukcji daty. Używając (4), otrzymasz, Invalid Dategdy new Date()jest używany wewnętrzny, a inne przestarzałe funkcje można zobaczyć w konsoli, więc moment można zaktualizować lub zastąpić przestarzałe metody w aplikacji.

Vignesh Raja
źródło
3

Jeśli Twoja data jest przekazywana z interfejsu API jako string(jak mój problem), możesz użyć filtru, aby na chwilę przekonwertować ciąg na datę. To zadba o moment ostrzeżenia o budowie.

$scope.apiDate = 10/29/2017 18:28:03";

angular.module('myApp').filter('stringToDate', function() {
  return function(value) {
     return Date.parse(value);
  };  
});

Dodaj to do widoku:

{{apiDate | stringToDate | amDateFormat:'ddd, MMM DD'}}
Fergus
źródło
0

Jak wskazano w powyższych odpowiedziach. Podanie formatu daty powinno działać.

Dlaczego miałbym otrzymywać komunikat o wycofaniu z następującym wierszem kodu. Wydawało mi się, że format String + miał rozwiązać ten problem. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). Ponadto, proszę, nie mam kontroli nad udostępnianym formatem daty. Wiem, że mogę go samodzielnie przekonwertować, aby 'YYYY-MM-DDTHH:mm:ss'wtedy moment nie wyświetlał komunikatu o zaniechaniu. Jednak zgodnie z dokumentacją linia kodu powinna działać. Oto komunikat o wycofaniu, który widzę.

„Ostrzeżenie o wycofaniu: podana wartość nie jest w rozpoznawanym formacie RFC2822 lub ISO. Konstrukcja momentu powraca do js Date (), co nie jest niezawodne we wszystkich przeglądarkach i wersjach. Formaty daty niezgodne z RFC2822 / ISO są odradzane i zostaną usunięte w nadchodząca główna wersja. Więcej informacji można znaleźć pod adresem http://momentjs.com/guides/#/warnings/js-date/ ”.

user2027058
źródło