"Avertissement de dépréciation: la construction du moment revient à js Date" lors de la tentative de conversion de la date RFC2822 en moment.js

164

J'utilise le code suivant pour convertir une date-heure côté serveur en heure locale en utilisant moment.js.

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

Mais je reçois:

Avertissement de dépréciation: la construction du moment revient à js Date. Ceci est déconseillé et sera supprimé dans la prochaine version majeure. Veuillez vous référer à https://github.com/moment/moment/issues/1407 pour plus d'informations.

Il semble que je ne peux pas m'en débarrasser! Comment puis-je y remédier?

Dariush
la source
avez-vous lu où il est dit de le faire?
toesslab
7
Bien sûr, j'ai lu !! mais soit je suis confus et je n'ai pas pu trouver de solution, soit il n'y avait pas de solution du tout!
dariush
Après avoir lu un peu là-bas, cela semble être un vrai problème, qui a été discuté il y a des mois ... Prenez un autre outil ...
toesslab

Réponses:

315

Pour vous débarrasser de l'avertissement, vous devez soit:

  • Transmettez une version au format ISO de votre chaîne de date:

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

  • Passez la chaîne que vous avez maintenant, mais indiquez à Moment le format de la chaîne:

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

  • Convertissez votre chaîne en un objet Date JavaScript, puis transmettez-le à Moment:

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

La dernière option est une solution de secours intégrée que Moment prend en charge pour le moment, avec l'avertissement de console obsolète. Ils disent qu'ils ne prendront pas en charge cette solution de secours dans les prochaines versions. Ils expliquent que l'utilisation new Date('my date')est trop imprévisible.

Joe Wilson
la source
36
N'importe quel texte dans les puces de la réponse ci-dessus ferait un bien meilleur message d'avertissement de dépréciation que celui qui a déclenché cette question.
Sera
2
Est-ce que l'utilisation est moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());ok? Ou suis-je simplement en train de supprimer un problème prêt à s'écraser silencieusement dans un proche avenir comme celui-ci?
Bruno Finger
Vous pouvez également recevoir ce message si la valeur transmise contient des caractères supplémentaires de début ou de fin, tels que des espaces. Cela va généralement avec un Invalidrésultat de date.
Guillaume Renoult
@BrunoFinger qui devrait fonctionner. Date () et toISOString () sont des éléments JavaScript, pas des éléments Moment.
Joe Wilson
Si vous n'avez pas le choix sur la façon dont la date est fournie, je vous recommande la deuxième puce, en spécifiant le format de la chaîne de date. Cela supprime le plus d'ambiguïté.
Joshua Pinter
50

Comme alternative, vous pouvez supprimer l'affichage de l'avertissement d'obsolescence en définissant moment.suppressDeprecationWarnings = true;

niutech
la source
Pour TypeScript, vous devrez peut-être le faire précéder de // @ts-ignore(au moins pour certaines versions de moment-timezone et @ types / moment-timezone).
TrueWill le
7

La construction de la date momentutilise en interne le new Date()dans le javascript. La new Date()construction reconnaît la chaîne de date aux formats RFC2822 ou ISO dans tous les navigateurs. Lors de la construction d'un momentobjet dont la date n'est pas dans ces formats, l'avertissement d'obsolescence est émis.

Bien que les avertissements d'obsolescence soient lancés, pour certains formats, l' momentobjet sera construit avec succès dans Chrome, mais pas dans Firefox ou Safari. Pour cette raison, le traitement de la date dans Chrome peut donner des résultats comme prévu (pas tout le temps) et en ajouter Invalid Dated'autres.

Considérez 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

Donc, le moment.jsest utilisé à vos propres risques au cas où les formats recommandés / standard ne seraient pas utilisés.

Pour supprimer les avertissements d'obsolescence ,

  1. Comme suggéré par @Joe Wilson dans la réponse précédente, indiquez le format de date lors de la momentconstruction.

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

  1. Donnez la date au format ISO ou RFC2822.

Exemple: moment("2018-02-01T18:30:00.000Z")- Format ISO

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

  1. Comme suggéré par @niutech dans la réponse précédente, définissez

moment.suppressDeprecationWarnings = true;

  1. Je suggère d'écraser le repli d'entrée dans le moment.

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

Comme (3) supprimera tous les avertissements, (4) supprimera uniquement le repli de construction de date. En utilisant (4), vous obtiendrez au Invalid Datefur et à mesure que l'interne new Date()est utilisé et que d'autres dépréciations peuvent être vues dans la console, ainsi le moment peut être mis à niveau ou les méthodes obsolètes peuvent être remplacées dans l'application.

Vignesh Raja
la source
3

Si votre date vous est transmise depuis une API comme string(comme mon problème), vous pouvez utiliser un filtre pour convertir la chaîne en une date pour un moment. Cela prendra en charge l'avertissement de construction du moment.

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

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

Ajoutez-le à la vue:

{{apiDate | stringToDate | amDateFormat:'ddd, MMM DD'}}
Fergus
la source
0

Comme indiqué dans les réponses ci-dessus. Fournir le format de date devrait fonctionner.

Pourquoi recevrais-je le message d'obsolescence avec la ligne de code suivante. Je pensais que le format String + était censé résoudre le problème. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). De plus, je n'ai pas de contrôle sur le format de date fourni. Je sais que je peux le convertir moi-même pour que 'YYYY-MM-DDTHH:mm:ss'le moment ne montre pas le message d'obsolescence. Cependant, selon la documentation, la ligne de code devrait fonctionner. Voici le message d'obsolescence que je vois.

"Avertissement de dépréciation: la valeur fournie n'est pas dans un format RFC2822 ou ISO reconnu. La construction du moment revient à js Date (), qui n'est pas fiable sur tous les navigateurs et toutes les versions. Les formats de date non RFC2822 / ISO sont déconseillés et seront supprimés dans un prochaine version majeure. Veuillez consulter http://momentjs.com/guides/#/warnings/js-date/ pour plus d'informations. "

user2027058
la source