javascript - "Avskrivningsvarning: moment-konstruktion faller tillbaka till js Date" när man försöker konvertera RFC2822-datum i moment.js
Jag använder följande kod för att konvertera ett server-sidigt datum och tid till lokal tid med moment.js.
moment(moment('Wed, 23 Apr 2014 09:54:51 +0000').format('lll')).fromNow()
Men jag får:
Avvecklingsvarning: moment-konstruktion faller tillbaka på js Date. Detta är avrått och kommer att tas bort i kommande stora version. Vänligen se https://github.com/moment/moment/issues/1407 för mer information.
Det verkar som att jag inte kan bli av med det! Hur kan jag fixa det?
Svar #1
För att bli av med varningen behöver du antingen:
Skicka in en ISO-formaterad version av din datumsträng:
moment('2014-04-23T09:54:51');Skicka in strängen du har nu, men tala om för Moment i vilket format strängen är:
moment('Wed, 23 Apr 2014 09:54:51 +0000', 'ddd, DD MMM YYYY HH:mm:ss ZZ');Konvertera din sträng till ett JavaScript Date-objekt och skicka sedan det till Moment:
moment(new Date('Wed, 23 Apr 2014 09:54:51 +0000'));
Det sista alternativet är en inbyggd reservlösning som Moment stöder för tillfället, med den föråldrade konsolvarningen. De säger att de inte kommer att stödja denna reservlösning i framtida versioner. De förklarar att användning av new Date('my date') är för oförutsägbar.
Svar #2
Som ett alternativ kan du undertrycka visningen av föråldradhetsvarningen genom att ställa in moment.suppressDeprecationWarnings=true;
Svar #3
Datumkonstruktionen i moment använder internt new Date() i JavaScript. new Date()-konstruktionen känner igen datumsträngen antingen i RFC2822 eller ISO-format i alla webbläsare. När man skapar ett moment-objekt med ett datum som inte är i dessa format, visas varningen om föråldring.
Även om varningarna för avskrivning kastas, för vissa format kommer moment-objektet att konstrueras framgångsrikt i Chrome, men inte i Firefox eller Safari. På grund av detta kan bearbetning av datumet i Chrome ge förväntade resultat (inte alltid) och kastar Invalid Date i andra webbläsare.
Överväg, 02.02.2018,
Chrome - moment("02.02.2018")._d -> Fre 02 feb 2018 00:00:00 GMT+0530 (Indisk standardtid)
Firefox - moment("02.02.2018")._d -> Ogiltigt datum
Safari - moment("02.02.2018")._d -> Ogiltigt datum
Så moment.js används på egen risk om de rekommenderade/standardformaten inte används.
För att undertrycka varningarna om föråldring,
- Som föreslagits av @Joe Wilson i tidigare svar, ge datumformatet på
moment-konstruktionen.
Exempel: moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");
- Ange datumet i ISO- eller RFC2822-format.
Exempel: moment("2018-02-01T18:30:00.000Z") - ISO-format
moment("Thu, 01 Feb 2018 18:30:00 GMT") - RFC2822-format - Format på Github
- Som föreslagits av @niutech i tidigare svar, ställ in
moment.suppressDeprecationWarnings = true;Jag föreslår att skriva över inmatningsfallbacken för tillfället.
moment.createFromInputFallback=function (config){ config._d = new Date(config._i); }
Eftersom (3) kommer att undertrycka alla varningar, kommer (4) att undertrycka endast datumkonstruktionsåtergången. Genom att använda (4) kommer du att få Invalid Date eftersom den interna new Date() används och andra föråldringar kan ses i konsolen, så moment kan uppgraderas eller de föråldrade metoderna kan ersättas i applikationen.
