"Avviso di deprecazione: la costruzione del momento ricade in js Date" quando si tenta di convertire la data RFC2822 in moment.js


164

Sto usando il seguente codice per convertire una data-ora sul lato server in ora locale usando moment.js.

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

Ma sto ottenendo:

Avviso di deprecazione: la costruzione del momento ricade su js Date. Questo è scoraggiato e verrà rimosso nella prossima versione principale. Per ulteriori informazioni, consultare https://github.com/moment/moment/issues/1407 .

Sembra che non riesca a liberarmene! Come posso ripararlo?


hai letto dove dice di farlo?
toesslab,

7
Certo che ho letto !! ma o sono confuso e non sono riuscito a trovare alcuna soluzione o non c'era alcuna soluzione lì dentro!
Dariush,

Dopo aver letto un po 'lì, sembra essere un vero problema, che è stato discusso mesi fa ... Prendi un altro strumento ...
toesslab

Risposte:


315

Per eliminare l'avviso, è necessario:

  • Passa in una versione in formato ISO della stringa della data:

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

  • Passa la stringa che hai ora, ma indica a Moment in quale formato è la stringa:

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

  • Converti la tua stringa in un oggetto JavaScript Date e poi passalo in Moment:

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

L'ultima opzione è un fallback integrato che Moment supporta per ora, con l'avviso di console deprecato. Dicono che non supporteranno questo fallback nelle versioni future. Spiegano che l'utilizzo new Date('my date')è troppo imprevedibile.


36
Qualsiasi testo tra i punti elenco nella risposta precedente renderebbe un messaggio di avviso di deprecazione molto migliore di quello confuso che ha dato il via a questa domanda.
Sarà il

2
Sta usando moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());ok? O sto solo sopprimendo un problema pronto a schiantarsi silenziosamente nel prossimo futuro in questo modo?
Bruno Finger,

Puoi anche avere questo messaggio se il valore passato contiene caratteri extra iniziali o finali, come gli spazi. In genere si ottiene un Invalidrisultato data.
Guillaume Renoult,

@BrunoFinger che dovrebbe funzionare. Date () e toISOString () sono cose JavaScript, non cose Moment.
Joe Wilson,

Se non hai scelta su come viene fornita la data, ti consiglio il secondo punto elenco, specificando il formato della data String. Elimina la maggior ambiguità.
Joshua Pinter,

50

In alternativa, è possibile eliminare la visualizzazione dell'avviso di deprecazione impostando moment.suppressDeprecationWarnings = true;


Per TypeScript, potrebbe essere necessario precedere questo // @ts-ignore(almeno per alcune versioni di moment-timezone e @ types / moment-timezone).
TrueWill,

7

La costruzione della data momentutilizza internamente il file new Date()nel javascript. La new Date()costruzione riconosce la stringa della data nei formati RFC2822 o ISO in tutti i browser. Quando si costruisce un momentoggetto con data non in questi formati, viene lanciato l'avviso di deprecazione.

Sebbene vengano lanciati gli avvisi di deprecazione, per alcuni formati, l' momentoggetto verrà costruito correttamente in Chrome, ma non in Firefox o Safari. A causa di ciò, l'elaborazione della data in Chrome può dare risultati come previsto (non sempre) e generare Invalid Datealtri.

Si consideri, 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

Quindi moment.jsviene utilizzato a proprio rischio nel caso in cui non vengano utilizzati i formati consigliati / standard.

Per eliminare gli avvisi di deprecazione ,

  1. Come suggerito da @Joe Wilson nella risposta precedente, fornire il formato della data sulla momentcostruzione.

Esempio : moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");

  1. Indicare la data in formato ISO o RFC2822.

Esempio: moment("2018-02-01T18:30:00.000Z")- Formato ISO

moment("Thu, 01 Feb 2018 18:30:00 GMT")- Formato RFC2822 - Formato in Github

  1. Come suggerito da @niutech nella risposta precedente, impostare

moment.suppressDeprecationWarnings = true;

  1. Suggerisco di sovrascrivere il fallback di input nel momento.

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

Poiché (3) eliminerà tutti gli avvisi, (4) eliminerà solo il fallback della costruzione della data. Usando (4), otterrai Invalid Datecome new Date()viene utilizzato l'interno e altre console possono essere viste nella console, quindi il momento può essere aggiornato o i metodi deprecati possono essere sostituiti nell'applicazione.


3

Se la tua data ti viene passata da un'API come string(come il mio problema), puoi utilizzare un filtro per convertire la stringa in una data per il momento. Questo si occuperà dell'avviso di costruzione del momento.

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

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

Aggiungilo alla vista:

{{apiDate | stringToDate | amDateFormat:'ddd, MMM DD'}}

0

Come indicato nelle risposte sopra. Fornire il formato della data dovrebbe funzionare.

Perché dovrei ricevere il messaggio di deprecazione con la seguente riga di codice. Ho pensato che il formato String + avrebbe dovuto risolvere il problema. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). Inoltre, per favore, non ho il controllo sul formato della data fornito. So che posso convertirlo da solo in 'YYYY-MM-DDTHH:mm:ss'quel momento non mostra il messaggio di deprecazione. Tuttavia, secondo la documentazione, la riga di codice dovrebbe funzionare. Ecco il messaggio di deprecazione che sto vedendo.

"Avviso di deprecazione: il valore fornito non è in un formato RFC2822 o ISO riconosciuto. La costruzione del momento risale a js Date (), che non è affidabile su tutti i browser e versioni. I formati di data non RFC2822 / ISO sono sconsigliati e verranno rimossi in un prossima versione principale. Per ulteriori informazioni, consultare http://momentjs.com/guides/#/warnings/js-date/ . "

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.