Moment: Unterstützung für dezimale Millisekunden

Erstellt am 22. Juni 2016  ·  3Kommentare  ·  Quelle: moment/moment

(Version 2.13.0)
Der ISO-Standard erlaubt eine beliebige Anzahl von Dezimalsekunden vor dem 'Z' in einem dateTime-String. Die .net-Plattform scheint 7 Dezimalstellen zu verwenden - während die Bibliothek moment.js nur die ersten 3 Dezimalstellen auswertet.

Ich habe den Formatierer (toISOString()) von Monkey gepatcht, um die vollen 7 Ziffern aus dem Erstellungsobjekt zu ziehen - aber das ist ein schrecklicher Hack. Das Patchen des Parsers wäre viel besser - übersteigt aber mein derzeitiges Verständnis.

Gibt es vielleicht noch einen Workaround?

Hilfreichster Kommentar

Maggie,

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

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

für mich brauche ich wirklich diese zusätzlichen Ziffern. Nullen sind nicht gut genug.

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

parst manuell die Millisekunden aus der Eingabezeichenfolge (wenn dies der Fall ist)
erhältlich).

//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(); } }
Es ist nicht schön - und wird nur für Momente funktionieren, die waren
ursprünglich aus einer ISO-Datumszeichenfolge geparst. Es wird auch inkonsistent sein
mit der Funktion Millisekunden(). Eine bessere Idee wäre es, die
Parsing-Prozess und ziehen Sie alle Dezimalsekunden in eine separate Eigenschaft auf
das Momentobjekt - dann können wir das bei Bedarf zurückgeben.

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

moment.js-Bibliothek - es wäre kein Wrapper mehr für a
Javascript-Datumsobjekt.

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

Dokumentation? Im Moment wird die Millisekundenkürzung aus dem
Beispielcode, aber nicht explizit beschrieben - und es gibt keine Erklärung wie
warum es sich so verhält.

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

Grüße,
Ben Hathaway
Softwareentwickler
DATUM - Geotechnisches und strukturelles Monitoring

Alle 3 Kommentare

Da Moment.js ein Wrapper für das Date-Objekt in JavaScript ist, sind wir auf drei Dezimalstellen (Millisekunden) beschränkt. Dies liegt daran, dass dies alles ist, was das Datumsobjekt unterstützt, sodass es wirklich keine Möglichkeit gibt, mehr zu speichern. Sie sollten jedoch nichts manipulieren müssen, um sieben Dezimalstellen anzuzeigen oder zu analysieren. Beachten Sie jedoch, dass nur die ersten drei tatsächlich verwendet werden.

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

Beachten Sie, dass die Ausgabe mit Nullen gefüllt ist, aber es gibt sieben Stellen in beide Richtungen.

Maggie,

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

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

für mich brauche ich wirklich diese zusätzlichen Ziffern. Nullen sind nicht gut genug.

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

parst manuell die Millisekunden aus der Eingabezeichenfolge (wenn dies der Fall ist)
erhältlich).

//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(); } }
Es ist nicht schön - und wird nur für Momente funktionieren, die waren
ursprünglich aus einer ISO-Datumszeichenfolge geparst. Es wird auch inkonsistent sein
mit der Funktion Millisekunden(). Eine bessere Idee wäre es, die
Parsing-Prozess und ziehen Sie alle Dezimalsekunden in eine separate Eigenschaft auf
das Momentobjekt - dann können wir das bei Bedarf zurückgeben.

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

moment.js-Bibliothek - es wäre kein Wrapper mehr für a
Javascript-Datumsobjekt.

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

Dokumentation? Im Moment wird die Millisekundenkürzung aus dem
Beispielcode, aber nicht explizit beschrieben - und es gibt keine Erklärung wie
warum es sich so verhält.

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

Grüße,
Ben Hathaway
Softwareentwickler
DATUM - Geotechnisches und strukturelles Monitoring

Hallo @maggiepint ,

Ich suche das gleiche. Nachdem ich moment.js , bemerkte ich, dass es eine zerofill Funktion aufruft.

Da der resultierende Wert ein String ist, verstehe ich nicht, warum er mit Null gefüllt wird🤔🤔🤔
Ich habe zum Beispiel das:

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

Es druckt 07/30/2020 08:53:50.963000 anstelle von 07/30/2020 08:53:50.963939

Außerdem ist mir aufgefallen, dass eine ältere Version von moment.js diese Nullfüllung nicht durchführte, zum Beispiel Version 2.5.

Ich muss jetzt einen benutzerdefinierten Formatierer schreiben, um die korrekten Informationen im Datum beizubehalten, es sei denn, an moment.js eine Änderung vorgenommen. Haben wir eine Chance, diese Änderung vorzunehmen?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

tanepiper picture tanepiper  ·  3Kommentare

ninigix picture ninigix  ·  3Kommentare

RobinvanderVliet picture RobinvanderVliet  ·  3Kommentare

dogukankotan picture dogukankotan  ·  3Kommentare

alvarotrigo picture alvarotrigo  ·  3Kommentare