Moment: Soporte para milisegundos decimales

Creado en 22 jun. 2016  ·  3Comentarios  ·  Fuente: moment/moment

(ver 2.13.0)
El estándar ISO permite cualquier número de segundos decimales antes de la 'Z' en una cadena de fecha y hora. La plataforma .net parece usar 7 lugares decimales, mientras que la biblioteca moment.js solo analiza los primeros 3 lugares decimales.

Monkey parcheó el formateador (toISOString ()) para extraer los 7 dígitos completos del objeto de creación, pero este es un truco terrible. Parchar el analizador sería mucho mejor, pero está más allá de mi comprensión actual.

¿Quizás haya otra solución alternativa?

Comentario más útil

Maggie,

Ah. I hadn't realised this was a limitation of Javascript.

I had found the option for formatting that you had mentioned - but

para mí realmente necesito esos dígitos adicionales. Los ceros no son lo suficientemente buenos.

My 'monkey patch' looks at the creationData for the moment and

analiza manualmente los milisegundos de la cadena de entrada (si es
disponible).

//Monkey patch the moment library to use 7 decimal places for seconds in it's standard ISO format - to match C# moment.fn._oldToISOString = moment.fn.toISOString; moment.fn.toISOString = function () { try { var originalDateSplit = moment(this).creationData().input.split("."); var milliseconds = originalDateSplit[originalDateSplit.length - 1]; if (milliseconds.indexOf(this.milliseconds()) === 0) { return moment(this).format('YYYY-MM-DD[T]HH:mm:ss.') + milliseconds + "Z"; } else { return moment(this)._oldToISOString(); } } catch (error) { return moment(this)._oldToISOString(); } }
No es bonito, y solo funcionará en momentos que fueron
originalmente analizado a partir de una cadena de fecha ISO. También será inconsistente
con la función milisegundos (). Una mejor idea sería interceptar el
proceso de análisis y extraiga cualquier segundo decimal en una propiedad separada en
el objeto de momento, entonces podemos devolverlo según sea necesario.

However - I do appreciate that we are moving beyond the scope of the

biblioteca moment.js en este punto, ya no sería un contenedor para un
Objeto de fecha de Javascript.

Perhaps we could make this limitation a little clear in the moment.js

¿documentación? En este momento, el truncamiento de milisegundos está implícito en el
código de ejemplo, pero no se describe explícitamente, y no hay explicación como
a por qué se comporta de esta manera.

Thank you for your help Maggie - it is much appreciated.

Saludos,
Ben Hathaway
Desarrollador de software
DATUM - Monitoreo geotécnico y estructural

Todos 3 comentarios

Debido a que Moment.js es un contenedor para el objeto Date en JavaScript, estamos limitados a tres lugares decimales (milisegundos). Esto se debe a que eso es todo lo que admite el objeto de fecha, por lo que realmente no hay forma de almacenar más. Sin embargo, no debería tener que parchear nada para obtener siete lugares decimales para mostrar o analizar. Solo tenga en cuenta que solo se utilizarán realmente los tres primeros.

moment('2016-01-01T05:21:22.1234567Z').format('YYYY-MM-DDTHH:mm:ss.SSSSSSS')
"2015-12-31T23:21:22.1230000"

Tenga en cuenta que la salida se rellena con cero, pero hay siete dígitos en ambos sentidos.

Maggie,

Ah. I hadn't realised this was a limitation of Javascript.

I had found the option for formatting that you had mentioned - but

para mí realmente necesito esos dígitos adicionales. Los ceros no son lo suficientemente buenos.

My 'monkey patch' looks at the creationData for the moment and

analiza manualmente los milisegundos de la cadena de entrada (si es
disponible).

//Monkey patch the moment library to use 7 decimal places for seconds in it's standard ISO format - to match C# moment.fn._oldToISOString = moment.fn.toISOString; moment.fn.toISOString = function () { try { var originalDateSplit = moment(this).creationData().input.split("."); var milliseconds = originalDateSplit[originalDateSplit.length - 1]; if (milliseconds.indexOf(this.milliseconds()) === 0) { return moment(this).format('YYYY-MM-DD[T]HH:mm:ss.') + milliseconds + "Z"; } else { return moment(this)._oldToISOString(); } } catch (error) { return moment(this)._oldToISOString(); } }
No es bonito, y solo funcionará en momentos que fueron
originalmente analizado a partir de una cadena de fecha ISO. También será inconsistente
con la función milisegundos (). Una mejor idea sería interceptar el
proceso de análisis y extraiga cualquier segundo decimal en una propiedad separada en
el objeto de momento, entonces podemos devolverlo según sea necesario.

However - I do appreciate that we are moving beyond the scope of the

biblioteca moment.js en este punto, ya no sería un contenedor para un
Objeto de fecha de Javascript.

Perhaps we could make this limitation a little clear in the moment.js

¿documentación? En este momento, el truncamiento de milisegundos está implícito en el
código de ejemplo, pero no se describe explícitamente, y no hay explicación como
a por qué se comporta de esta manera.

Thank you for your help Maggie - it is much appreciated.

Saludos,
Ben Hathaway
Desarrollador de software
DATUM - Monitoreo geotécnico y estructural

Hola @maggiepint ,

Estoy buscando lo mismo. Después de depurar a través de moment.js , noté que llama a una función zerofill .

Dado que el valor resultante es una cadena, no veo por qué cero lo llena🤔🤔🤔
Por ejemplo, tengo esto:

const value = 1596099230963;
const formatString = 'MM/DD/YYYY HH:mm:ss.SSSSSS';
const val = moment.utc(value).format(formatString);
console.log(val);

Imprime 07/30/2020 08:53:50.963000 lugar de 07/30/2020 08:53:50.963939

Además, noté que la versión anterior de moment.js no hacía este relleno de cero, por ejemplo, la versión 2.5.

Tendré que escribir un formateador personalizado ahora para retener la información correcta en la fecha a menos que se realice un cambio en moment.js . ¿Alguna posibilidad de que podamos hacer este cambio?

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