"Advertencia de desaprobación: la construcción del momento vuelve a la fecha js" al intentar convertir la fecha RFC2822 en moment.js

164

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

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

Pero estoy obteniendo:

Advertencia de desaprobación: momento en que la construcción vuelve a la fecha js Esto se desaconseja y se eliminará en el próximo lanzamiento principal. Consulte https://github.com/moment/moment/issues/1407 para obtener más información.

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

dariush
fuente
¿Leíste donde se dice que lo hagas?
toesslab
77
¡Por supuesto que lo leí! ¡pero o estoy confundido y no pude buscar ninguna solución o no había ninguna solución allí en absoluto!
dariush
Después de leer un poco allí, parece ser un problema real, que se discutió hace meses ... Tome otra herramienta ...
toesslab

Respuestas:

315

Para deshacerse de la advertencia, debe:

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

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

  • Pase la cadena que tiene ahora, pero dígale 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 Fecha de JavaScript y luego páselo a Momento:

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

La última opción es un respaldo integrado que Moment admite por ahora, con la advertencia de consola obsoleta. Dicen que no admitirán este respaldo en futuras versiones. Explican que usar new Date('my date')es demasiado impredecible.

Joe Wilson
fuente
36
Cualquiera de los textos en las viñetas en la respuesta anterior haría un mensaje de advertencia de desaprobación mucho mejor que el mensaje confuso que inició esta pregunta.
Will
2
Está usando moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());ok? ¿O simplemente estoy suprimiendo un problema listo para bloquearse silenciosamente en un futuro cercano como este?
Bruno Finger
También puede tener este mensaje si el valor pasado contiene caracteres adicionales iniciales o finales, como espacios. Generalmente va con un Invalidresultado de fecha.
Guillaume Renoult
@BrunoFinger eso debería funcionar. Date () y toISOString () son elementos de JavaScript, no elementos de momento.
Joe Wilson
Si no puede elegir cómo se proporciona la fecha, le recomendaría el segundo punto, especificando el formato de la Cadena de fecha. Elimina la mayor ambigüedad.
Joshua Pinter
50

Como alternativa, puede suprimir la visualización de la advertencia de desuso configurando moment.suppressDeprecationWarnings = true;

niutech
fuente
Para TypeScript, es posible que deba preceder esto con // @ts-ignore(al menos para algunas versiones de moment-timezone y @ types / moment-timezone).
TrueWill
7

La construcción de la fecha en momentinternamente usa el new Date()en el javascript. La new Date()construcción reconoce la cadena de fecha en formatos RFC2822 o ISO en todos los navegadores. Cuando se construye un momentobjeto con fecha que no está en estos formatos, se emite la advertencia de desaprobación.

Aunque se lanzan advertencias de desaprobación, para algunos formatos, el momentobjeto se construirá con éxito en Chrome, pero no en Firefox o Safari. Debido a esto, procesar la fecha en Chrome puede dar resultados como se esperaba (no todo el tiempo) y arrojar Invalid Dateotros.

Considere, 02.02.2018,

Cromo - 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, moment.jsse usa bajo su propio riesgo en caso de que no se usen los formatos recomendados / estándar.

Para suprimir las advertencias de desaprobación ,

  1. Como lo sugirió @ Joe Wilson en la respuesta anterior, proporcione el formato de fecha en la momentconstrucción.

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 lo sugirió @niutech en la respuesta anterior, establezca

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á todas las advertencias, (4) suprimirá solo el retroceso de construcción de la fecha. Usando (4), obtendrá a Invalid Datemedida que new Date()se usa el interno y se pueden ver otras depreciaciones en la consola, por lo que se puede actualizar el momento o se pueden reemplazar los métodos en desuso en la aplicación.

Vignesh Raja
fuente
3

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 el momento. Esto se encargará del momento de advertencia de construcción.

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

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

Agréguelo a la vista:

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

Como se indica en las respuestas anteriores. Proporcionar el formato de fecha debería funcionar.

¿Por qué recibiría el mensaje de desaprobación con la siguiente línea de código? Pensé que el formato String + debía solucionar el problema. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). Además, por favor no, no tengo control sobre el formato de fecha que se proporciona. Sé que puedo convertirlo yo mismo, 'YYYY-MM-DDTHH:mm:ss'entonces el momento no muestra el mensaje de desaprobación. Sin embargo, de acuerdo con la documentación, la línea de código debería funcionar. Aquí está el mensaje de desaprobación que estoy viendo.

"Advertencia de desaprobación: el valor proporcionado no está en un formato RFC2822 o ISO reconocido. La construcción del momento se remonta a js Date (), lo que no es confiable en todos los navegadores y versiones. Los formatos de fecha no RFC2822 / ISO se desaconsejan y se eliminarán en un próximo lanzamiento importante. Consulte http://momentjs.com/guides/#/warnings/js-date/ para obtener más información ".

user2027058
fuente