Moment: Analizar valor sin retroceso

Creado en 10 jul. 2015  ·  9Comentarios  ·  Fuente: moment/moment

Pasar un valor arbitrario a moment(value) produce una advertencia de depreciación según # 1407.

Sería realmente bueno si hubiera alguna forma de usar este análisis pero sin recurrir al constructor Date. La única forma que he encontrado hasta ahora es bastante torpe:

if (moment.isDate(value)) {
    return moment(value);
} else {
    return moment(value, moment.ISO_8601);
}

E incluso entonces esto todavía no analiza ASP.net /Date(1198908717056)/ strings.

La opción más simple sería permitir la opción estricta en forma de dos argumentos: moment(value, true) .

Gracias.

Enhancement

Comentario más útil

@SystemParadox en caso de que sea útil, tuve un problema similar al tuyo y

function disableNativeDateFallback(config) {
    config._d = new Date(parseFloat('NaN')); // an invalid date
}
function makeMomentWrapper(momentFn) {
    return function() {
        var prevFallback = moment.createFromInputFallback;
        moment.createFromInputFallback = disableNativeDateFallback;
        var result = momentFn.apply(null, arguments);
        moment.createFromInputFallback = prevFallback;
        return result;
    }
};
var momentStrict = makeMomentWrapper(moment);
momentStrict.utc = makeMomentWrapper(moment.utc);

Funcionan reemplazando createFromInputFallback brevemente y luego restaurándolo antes de que regresen para evitar afectar a otro código. Cualquier código que esté listo para migrar puede usar momentStrict y momentStrict.utc lugar de moment y moment.utc y el resto puede permanecer como está.

Todos 9 comentarios

Solo para aclarar, está pidiendo una forma de deshabilitar el retroceso en lugar de mostrar la advertencia, sin usar el modo estricto, ¿verdad?

Sí, quiero analizar automáticamente todas las cosas que admite moment() , pero si todas fallan, en lugar de imprimir una advertencia y usar el constructor Date , quiero que produzca una fecha no válida.

Quiero optar por participar de forma preventiva en el comportamiento de una versión futura de moment , donde la reserva del constructor Date obsoleta se eliminará por completo.

No estoy seguro de a qué te refieres con modo estricto. ¿Quiere decir cuando pasa el formato exacto como moment(value, 'YYYY-MM-DD') ? Si es así, esto no ayuda porque 1. es prohibitivamente detallado y 2. todavía no incluye todos los formatos que moment(value) puede analizar antes de recurrir al constructor Date .

El modo estricto se habilita pasando true como último parámetro. Está en los documentos. Básicamente, significa que la cadena debe coincidir con el formato _exactamente_.

Dado que los formatos admitidos directamente por moment(String) se enumeran en los documentos, creo que sería aceptable considerar esto como el modo estricto. En otras palabras, agregando moment(String, Boolean) .

Si, eso sería muy bueno. Gracias.

@SystemParadox sí, lo que quieres es compatible. Simplemente anula moment.createFromInputFallback(config) :

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

Estoy de acuerdo en que no es trivial, pero es posible ;-)

Eso es útil, pero cambia la configuración globalmente.

¿Qué sucede si quiero migrar progresivamente una base de código una llamada a la vez?

¿Por qué no podemos simplemente agregar soporte para moment(String, true) ?

Reabrir, mientras existe la solución, tener esto en la API pública ayudaría a una variedad de casos de uso. Considere también # 2535, solicitando validación solo en los formatos incorporados.

Lo que se necesita es la constante moment.JS_DATE, eso significa que simplemente pase la entrada a new Date , consulte https://github.com/moment/moment/issues/1686. Aceptando solicitudes de extracción.

@SystemParadox en caso de que sea útil, tuve un problema similar al tuyo y

function disableNativeDateFallback(config) {
    config._d = new Date(parseFloat('NaN')); // an invalid date
}
function makeMomentWrapper(momentFn) {
    return function() {
        var prevFallback = moment.createFromInputFallback;
        moment.createFromInputFallback = disableNativeDateFallback;
        var result = momentFn.apply(null, arguments);
        moment.createFromInputFallback = prevFallback;
        return result;
    }
};
var momentStrict = makeMomentWrapper(moment);
momentStrict.utc = makeMomentWrapper(moment.utc);

Funcionan reemplazando createFromInputFallback brevemente y luego restaurándolo antes de que regresen para evitar afectar a otro código. Cualquier código que esté listo para migrar puede usar momentStrict y momentStrict.utc lugar de moment y moment.utc y el resto puede permanecer como está.

¿Fue útil esta página
0 / 5 - 0 calificaciones