Moment: Prise en charge des millisecondes décimales

Créé le 22 juin 2016  ·  3Commentaires  ·  Source: moment/moment

(version 2.13.0)
La norme ISO autorise un nombre quelconque de secondes décimales avant le « Z » dans une chaîne dateTime. La plate-forme .net semble utiliser 7 décimales - tandis que la bibliothèque moment.js n'analyse que les 3 premières décimales.

J'ai patché le formateur (toISOString()) pour extraire les 7 chiffres complets de l'objet de création - mais c'est un terrible hack. Patcher l'analyseur serait bien mieux - mais cela dépasse ma compréhension actuelle.

Peut-être y a-t-il une autre solution de contournement?

Commentaire le plus utile

Maggie,

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

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

pour moi, j'ai vraiment besoin de ces chiffres supplémentaires. Les zéros ne sont pas assez bons.

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

analyse manuellement les millisecondes de la chaîne d'entrée (si elle est
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(); } }
Ce n'est pas joli - et ne fonctionnera que pour les moments qui ont été
à l'origine analysé à partir d'une chaîne de date ISO. Ce sera aussi incohérent
avec la fonction millisecondes(). Une meilleure idée serait d'intercepter le
processus d'analyse et tirez toutes les secondes décimales dans une propriété distincte sur
l'objet du moment - alors nous pouvons le retourner si nécessaire.

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

bibliothèque moment.js à ce stade - ce ne serait plus un wrapper pour un
Objet Javascript Date.

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

Documentation? À l'heure actuelle, la troncature en millisecondes est implicite à partir du
exemple de code, mais pas explicitement décrit - et il n'y a pas d'explication car
pourquoi il se comporte de cette façon.

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

Salutations,
Ben Hathaway
Développeur de logiciels
DATUM - Surveillance Géotechnique et Structurelle

Tous les 3 commentaires

Étant donné que Moment.js est un wrapper pour l'objet Date en JavaScript, nous sommes limités à trois décimales (millisecondes). C'est parce que c'est tout ce que l'objet date prend en charge, il n'y a donc vraiment aucun moyen d'en stocker plus. Cependant, vous ne devriez pas avoir à patcher quoi que ce soit pour obtenir sept décimales à afficher ou à analyser. Sachez simplement que seuls les trois premiers seront réellement utilisés.

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

Notez que la sortie est remplie de zéros, mais qu'il y a sept chiffres dans les deux sens.

Maggie,

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

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

pour moi, j'ai vraiment besoin de ces chiffres supplémentaires. Les zéros ne sont pas assez bons.

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

analyse manuellement les millisecondes de la chaîne d'entrée (si elle est
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(); } }
Ce n'est pas joli - et ne fonctionnera que pour les moments qui ont été
à l'origine analysé à partir d'une chaîne de date ISO. Ce sera aussi incohérent
avec la fonction millisecondes(). Une meilleure idée serait d'intercepter le
processus d'analyse et tirez toutes les secondes décimales dans une propriété distincte sur
l'objet du moment - alors nous pouvons le retourner si nécessaire.

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

bibliothèque moment.js à ce stade - ce ne serait plus un wrapper pour un
Objet Javascript Date.

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

Documentation? À l'heure actuelle, la troncature en millisecondes est implicite à partir du
exemple de code, mais pas explicitement décrit - et il n'y a pas d'explication car
pourquoi il se comporte de cette façon.

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

Salutations,
Ben Hathaway
Développeur de logiciels
DATUM - Surveillance Géotechnique et Structurelle

Salut @maggiepint ,

Je cherche le même. Après avoir débogué moment.js , j'ai remarqué qu'il appelait une fonction zerofill .

Puisque la valeur résultante est une chaîne, je ne vois pas pourquoi elle la remplit à zéro🤔🤔🤔
Par exemple, j'ai ceci :

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

Il imprime 07/30/2020 08:53:50.963000 au lieu de 07/30/2020 08:53:50.963939

De plus, j'ai remarqué que l'ancienne version de moment.js ne faisait pas ce remplissage à zéro, par exemple la version 2.5.

Je vais devoir écrire un formateur personnalisé maintenant pour conserver les informations correctes dans la date à moins qu'un changement ne soit effectué le moment.js . Une chance que nous puissions faire ce changement?

Cette page vous a été utile?
0 / 5 - 0 notes