web-dev-qa-db-fra.com

«Avertissement de déprécation: la construction du moment tombe en js Date» lors de la tentative de conversion de la RFC2822 en moment.js

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

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

Mais j'obtiens:

Avertissement de déprécation: moment où la construction tombe à 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 le réparer?

149
dariush

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

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

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

  • Transmettez 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-la à Moment:

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

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

290
Joe Wilson

Vous pouvez également désactiver l'affichage de l'avertissement de dépréciation en définissant moment.suppressDeprecationWarnings = true;

32
niutech

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

Bien que les avertissements de dépréciation soient émis, pour certains formats, l’objet moment sera correctement construit dans Chrome, mais pas dans Firefox ou Safari. De ce fait, le traitement de la date dans Chrome peut donner les résultats escomptés (pas toujours) et jette Invalid Date dans d'autres.

Considérons, 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

Ainsi, le moment.js est utilisé à vos risques et périls dans le cas où les formats recommandés/standard ne sont pas utilisés.

Pour supprimer les avertissements de dépréciation ,

  1. Comme suggéré par @Joe Wilson dans la réponse précédente, donnez le format de date sur moment construction.

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 au moment opportun.

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

Comme (3) supprimera tous les avertissements, (4) supprimera uniquement le repli de la construction de la date. En utilisant (4), vous obtiendrez Invalid Date si la new Date() interne est utilisée et que d'autres dépréciations sont visibles dans la console. Vous pouvez donc mettre à jour moment ou les méthodes obsolètes peuvent être remplacées dans l'application.

6
Vignesh Raja

Si votre date vous a été transmise par une API sous la forme string (comme dans mon numéro), vous pouvez utiliser un filtre pour convertir la chaîne en date pour un moment. Cela va prendre en compte le moment de la construction.

$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'}}
3
Fergus

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

Pourquoi devrais-je recevoir le message de désapprobation avec la ligne de code suivante? Je pensais que le format String + était supposé résoudre ce problème. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). Aussi, s'il vous plaît, je n'ai pas le contrôle sur le format de date fourni. Je sais que je peux le convertir moi-même en 'YYYY-MM-DDTHH:mm:ss' alors le moment n’affiche pas le message de désapprobation. Cependant, selon la documentation, la ligne de code devrait fonctionner. Voici le message de désapprobation que je vois.

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

0
user2027058