Advertencia de obsolescencia: la construcción del momento vuelve a js Date


Estoy usando el siguiente código para convertir una fecha-hora del lado del servidor a hora local usando Momento.js

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

Pero estoy recibiendo:

Advertencia de obsolescencia: la construcción del momento vuelve a la fecha js. Esto se desaconseja y se eliminará en la próxima versión principal. Consulte https://github.com/moment/moment/issues/1407 para más información.

¡Parece que no puedo deshacerme de él! ¿Cómo puedo arreglarlo?

Author: gitsitgo, 2014-04-24

4 answers

Para deshacerse de la advertencia, debe:

  • Pase una versión con formato ISO de su cadena de fecha:

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

  • Pasa la cadena que tienes ahora, pero dile a Moment en qué formato está la cadena:

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

  • Convierta su cadena en un objeto de fecha JavaScript y luego pase eso a Moment:

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

La última opción es un respaldo incorporado que Moment soporta por ahora, con el advertencia de consola obsoleta. Dicen que no apoyarán esta alternativa en futuras versiones. Explican que usar new Date('my date') es demasiado impredecible.

 258
Author: Joe Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-29 22:23:55

Como alternativa, puede suprimir mostrar la advertencia de obsolescencia configurando moment.suppressDeprecationWarnings = true;

 20
Author: niutech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-25 17:23:20

Si su fecha se le pasa desde una API como string(como mi problema), puede usar un filtro para convertir la cadena en una fecha por momento. Esto se encargará de la advertencia de construcción momento.

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

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

Agrégalo a la vista:

{{apiDate | stringToDate | amDateFormat:'ddd, MMM DD'}}
 2
Author: Fergus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-30 04:54:08

La construcción de fecha en moment utiliza internamente el new Date() en el javascript. La construcción new Date() reconoce la cadena de fecha en cualquiera RFC2822 o ISO formatos en todos los navegadores. Cuando se construye un objeto moment con fecha no en estos formatos, se lanza la advertencia de obsolescencia.

Aunque se lanzan las advertencias de obsolescencia, para algunos formatos, el objeto moment se construirá con éxito en Chrome, pero no en Firefox o Safari. Debido a esto, el procesamiento de la fecha en Chrome puede dar resultados como se esperaba(no todo el tiempo) y arroja Invalid Date en otros.

Considere, 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

Por lo tanto, el moment.js se utiliza bajo su propio riesgo en caso de que no se utilicen los formatos recomendados/estándar.

Para suprimir las advertencias de caducidad ,

  1. Como sugirió @Joe Wilson en la respuesta anterior, indique el formato de fecha en la construcción moment.

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

  1. Indique la fecha en formato ISO o RFC2822.

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

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

  1. Como sugirió @niutech en la respuesta anterior, set

moment.suppressDeprecationWarnings = true;

  1. Sugiero sobrescribir la reserva de entrada en el momento.

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

Como (3) suprimirá todos los advertencias, (4) suprimirá solo la fecha de reserva de construcción. Usando (4), obtendrá Invalid Date a medida que se usa el new Date() interno y se pueden ver otras deprecaciones en la consola, por lo que moment se puede actualizar o los métodos obsoletos se pueden reemplazar en la aplicación.

 2
Author: Vignesh Raja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-17 19:07:15