Moment: Formatierung der Dauer

Erstellt am 5. Sept. 2013  ·  118Kommentare  ·  Quelle: moment/moment

Wir haben dies bereits in Nr. 463 und Nr. 879 angesprochen, aber nie wirklich direkt in einer eigenen Ausgabe darüber gesprochen.

Wir brauchen eine Methode zum Formatieren von Dauern, ähnlich wie wir Datumsangaben formatieren. Es sollte so einfach sein wie:

moment.duration(x).format("H:mm:ss")

Beachten Sie, dass die Formatierungstoken eine etwas andere Bedeutung haben müssten, da wir eher eine verstrichene Zeitdauer als eine Tageszeit darstellen. Ich schlage Folgendes vor:

  • hh würde bedeuten "Stunden verbleibend nach Berücksichtigung von Tagen"
  • h wäre die einstellige Form von hh
  • HH würde "insgesamt ganze Stunden" bedeuten
  • H wäre die einstellige Form von HH
  • HHH würde "Gesamtstunden einschließlich Dezimalstellen" bedeuten - obwohl dies derzeit mit duration.asHours() möglich ist, ist dies möglicherweise nicht erforderlich.

Eine ähnliche Formatierung würde für andere Einheiten gelten. Die höchste Einheit wäre in diesem Zusammenhang ein „Tag“, also ein Normtag bestehend aus 24 Normstunden. Aufgrund von Kalenderproblemen wäre es nicht sinnvoll, Jahre oder Monate damit zu messen.

Beachten Sie, dass dies kürzlich (wieder) auf StackOverflow in dieser Frage aufgetaucht ist. Der Benutzer hat nach etwas wie duration.format("H:mm:ss") gesucht. Dies ist die Problemumgehung:

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Das funktioniert, aber es fühlt sich hackig an. Das sollte eingebaut werden.

New Feature Up-For-Grabs

Hilfreichster Kommentar

Ist es nicht besser zu tun

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

anstatt

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Alle 118 Kommentare

+1

moment.duration(x).format("H:mm:ss") war genau das, was ich erwartet hatte, bevor ich verstand, dass es nicht funktionieren würde. Die von Matt vorgeschlagene Problemumgehung hat gut funktioniert, aber verglichen mit der Eleganz anderer Dinge in momentjs scheint es sicher abgehackt zu sein.

Ist es nicht besser zu tun

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

anstatt

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Code Bounty

@RobinvdVleuten - Das Problem bei der Verwendung von HH im aktuellen Formatierer besteht darin, dass es den Stundenanteil_ eines vollständigen Datums und einer vollständigen Uhrzeit darstellt. Wenn es um eine _verstrichene_ Zeit geht, können es gut 24 Stunden oder mehr sein. Versuchen Sie, 24 Stunden zu verstreichen, und Sie werden sehen, dass es auf Null zurückgesetzt wird.

Ich habe es tatsächlich bemerkt. Ich verwende jetzt die berechneten Millisekunden, um es zu formatieren, aber es ist immer noch ein hackiger Workaround.

Denken Sie, dass es nur eine "Restebene" geben wird - zB keine Möglichkeit zu sagen "Stunden nach Berücksichtigung von Monaten"? Ich denke, das ist eine vollkommen vernünftige Einschränkung, aber nur um eine Sekunde zu spucken, ich könnte mir vorstellen, ein "Anker" -Argument wie folgt bereitzustellen:

moment.duration(x).format("hh:mm:ss", "M");

Was uns sagt, dass die Stunden modulo der Monat sein sollten. Der Anker ist optional und würde standardmäßig die größte Einheit plus eine Nummer größer sein (in diesem Fall Tage). In ähnlicher Weise könnte es die Zeichenfolge selbst verwenden, um zu bestimmen, dass die Minuten modulo die Stunden und die Sekunden modulo Minuten sind. Wenn Sie dies getan haben:

moment.duration(x).format("hh:ss");

...die Sekunden wären modulo die Stunden.

Das ist wahrscheinlich alles keine großartige Idee - es ist nicht ausgebügelt (wohin gehen Wochen in dieser Hierarchie?) und es ist wahrscheinlich unnötig (die Leute wollen solche Löcher wahrscheinlich nicht). Aber es macht Spaß darüber nachzudenken.

Mal im Ernst, wie werden Sie mit dieser Klein-/Großbuchstaben-Notation mit Monat vs. Minuten umgehen?

Ich stellte mir vor, dass Tage die maximale Einheitsgröße sein würden, sodass Monate nicht ins Bild kommen würden. Im Grunde ist dies das Gegenteil davon, wie wir Dauern aus asp.net-Zeitspannen analysieren.

Macht Sinn.

Ich habe ein SCORM 2004 RTE (p77) -Dokument gelesen und festgestellt, dass die Zeitintervalldarstellung wie folgt lautet. Ich denke, dies stammt von einem Standard:

Theoretisch kann ich einen Wert übergeben wie: P34H
und die Parser sollten das als 1 Tag und 10 Stunden interpretieren

Ich hoffe, es könnte möglich sein, die Ausgabe in diesem Sinne zu formatieren
wie 'PHM'
und der Formatierer interpretiert das als Gesamtzahl der verbleibenden Stunden in Minuten?
Ich möchte in der Lage sein, die Ausgabe wie HH: MM zu formatieren

Ich hoffe, diese Informationen sind hilfreich

Zeitintervall (Sekunde, 10,2): Das Zeitintervall (Sekunde, 10, 2) gibt an, dass der Wert für
Das Datenmodellelement timeinterval stellt die verstrichene Zeit mit einer Genauigkeit von 0,01 dar
Sekunden[1]. Die SCORM-Punktnotationsbindung definiert ein bestimmtes Format für a
Zeichenkette zur Darstellung eines Zeitintervalls.
Das Format der Zeichenfolge muss wie folgt sein:
P[yY][mM][dD][T[hH][nM][s[.s]S]] wobei:
• y: Die Anzahl der Jahre (ganzzahlig, >= 0, nicht eingeschränkt)
• m: Die Anzahl der Monate (ganzzahlig, >=0, nicht eingeschränkt)
• d: Die Anzahl der Tage (ganzzahlig, >=0, nicht eingeschränkt)
• h: Die Anzahl der Stunden (ganzzahlig, >=0, nicht eingeschränkt)
• n: Die Anzahl der Minuten (Integer, >=0, nicht eingeschränkt)
• s: Die Anzahl der Sekunden oder Bruchteile von Sekunden (Real oder Integer, >=0, not
eingeschränkt). Wenn Sekundenbruchteile verwendet werden, schränkt SCORM die Zeichenfolge weiter auf ein
maximal 2 Ziffern (z. B. 34,45 – gültig, 34,45454545 – nicht gültig).
• Die Zeichenliteralbezeichner P, Y, M, D, T, H, Man und S sollen erscheinen, wenn die
entsprechender Nicht-Null-Wert vorhanden ist.
• Auffüllen der Werte mit Nullen soll unterstützt werden. Das Auffüllen mit Nullen ändert nichts an der
ganzzahliger Wert der Zahl, die durch eine Reihe von Zeichen dargestellt wird. Für
Beispiel: PT05H entspricht PT5H und PT000005H.
Beispiel:
• P1Y3M2DT3H gibt einen Zeitraum von 1 Jahr, 3 Monaten, 2 Tagen und 3 Stunden an
• PT3H5M gibt einen Zeitraum von 3 Stunden und 5 Minuten an

Implementierer sollten sich darüber im Klaren sein, dass das Format und die Bindung für die Kommunikation von sind
die Daten zwischen einem SCO und einem LMS. Da das Format einen Zeitraum darstellt,
dann entspricht eine Dauer wie PT5M PT300S.
Wenn das Datenmodellelement vom Typ timeinterval(second,10,2) einen Wert enthält, dann
• Der Bezeichner P muss vorhanden sein;
• Wenn der Wert von Jahren, Monaten, Tagen, Stunden, Minuten oder Sekunden Null ist, wird der Wert
und die entsprechende Zeichen-Literal-Bezeichnung kann weggelassen werden, aber mindestens eine
Neben dem Bezeichner müssen Zeichen, Literal, Bezeichner und Wert vorhanden sein
P;
• Die Bezeichnung T entfällt, wenn alle Zeitkomponenten (Stunden, Minuten
und Sekunden) werden nicht verwendet. Ein Nullwert kann jederzeit verwendet werden
Komponenten (z. B. PT0S).

Die Dauerformatierung wäre eine hervorragende Ergänzung. Es sind keine zwei unterschiedlichen "Stunden"-Token erforderlich. Gehen Sie von einer Dauer von 32 Stunden aus. Sie möchten niemals nur 8 Stunden extrahieren, ohne auch 1 Tag zu extrahieren.

Ich denke, @icambron hat einen guten Vorschlag. Analysieren Sie die Formatzeichenfolge in Tokens und drücken Sie die Dauer in Bezug auf die größte Einheit aus. Analysieren Sie die Token einzeln der Reihe nach (z. B. "DD:hh:ss" bedeutet Anzahl vollständiger Tage, Anzahl vollständiger Stunden nach Berücksichtigung von Tagen, Anzahl vollständiger Sekunden nach Berücksichtigung von Tagen + Stunden).

Ich habe ein moment.duration.format-Plugin gepostet:
https://github.com/jsmreese/moment-duration-format

Ich denke, es spricht die meisten Ideen / Anwendungsfälle in diesem Thread an.

@jsmreese Haben Sie erwogen, eine Pull-Anfrage einzureichen, die Ihr Plugin als Kernbestandteil von momentjs enthält?

@hotzenklotz Ja, ich habe überlegt, einen Pull-Request zu stellen.

Ich habe dies aus all den Gründen, die @icambron in #1538 dargelegt hat, nicht getan.

Mein Plugin:

  • hängt von Lo-Dash ab
  • sieht nicht aus und fühlt sich nicht wie Moment.js-Code an
  • verwendet einen völlig anderen Testaufbau

Ich würde es _lieben_, wenn mein Plugin Teil des Moment.js-Kerns wird ... aber ich werde ihre Zeit nicht mit einer Pull-Anforderung verschwenden, bevor diese Probleme behoben sind.

Wir möchten auch sicherstellen, dass der Code internationalisiert werden kann. Glücklicherweise befinden sich die meisten Strings, die wir benötigen würden, im Unicode-CLDR, sodass nur sehr wenig Übersetzungsarbeit erforderlich sein sollte.

Die CLDR hat auch gebietsschemaspezifische Empfehlungen zur Formatierung bestimmter Arten von Intervallen, die potenziell nützlicher sein könnten als willkürliche Formate für die Dauer. Ich bin mir nicht sicher, wie das hier reinpasst, aber es kann nett sein, automatisch gebietsschemaspezifische Intervalle zwischen zwei bestimmten Zeiten anzeigen zu können.

Das CLDR enthält auch Informationen darüber, wie bestimmte Zeitintervalle (anstelle von Dauern) angezeigt werden, was irgendwann nützlich sein könnte ...

Englische (US) Kalenderdaten

Gerade wurde eine neue Version von Moment Duration Format veröffentlicht, die die bisherige Abhängigkeit von Lo-Dash oder Underscore aufhebt.

https://github.com/jsmreese/moment-duration-format

@jsmreese Passt perfekt zu unseren Bedürfnissen. Danke!

+1

+1

+1

+1

+1

+1

+1

+1

Ich klinge in dieser Frage wahrscheinlich wie ein gebrochener Rekord, aber ich möchte sicherstellen, dass jede Lösung, wo immer möglich, bestehenden Konventionen folgt und leicht internationalisiert werden kann (was das Hinzufügen von Symbolen ähnlich LLLL für häufig verwendete Dauerformate beinhaltet .

Etwas ärgerlicherweise bietet die CLDR nicht viele spezifische Richtlinien für die Formatierung von Dauer, obwohl es umfangreiche relative Dauer- und Intervallrichtlinien gibt, die an anderer Stelle nützlich sein könnten. Sie bieten jedoch einige minimale Richtlinien und Übersetzungen für Dauereinheiten , die es Ihnen ermöglichen würden, die relevanten Einheiten zu verketten, wenn Sie etwas wie humanize() implementieren.

Die oben beschriebene hh / h Syntax fühlt sich wie eine deutliche Abweichung von den Formatierungstoken an, die von ISO8601, CLDR und Apache verwendet werden, und ich würde es vorziehen, sie nach Möglichkeit zu vermeiden.

Ein besserer Vorschlag könnte darin bestehen, die signifikanteste Einheit im Formatierungsmuster als Modulo zu verwenden, sodass h:mm:ss eine „normale“ Zeit anzeigen würde, aber die Stunden nach 24 zählen würde (z. B. 26:30:00). Es ist unklar, wie man überhaupt ein Muster wie "HH:MM:ss" berechnen würde oder was der Anwendungsfall dafür wäre. Entwicklern zu erlauben, dieses Verhalten außer Kraft zu setzen, scheint auch leicht zu einer Fehlerquelle werden zu können.

Im Geiste von „i18n überall“ definiert die CLDR Dauerformate für:

  • Stunden + Minuten ( h:mm in EN-US)
  • Stunden + Minuten + Sekunde ( h:mm:ss in EN-US)
  • Minuten + Sekunden ( m:ss in EN-US)
    und es kann sinnvoll sein, für diese Zeiträume gebietsschemaspezifische Konstanten (ähnlich den LLL -Datumsformaten) bereitzustellen.

Leider ist die Formatierung von Dauern mit Einheiten größer als Stunden wirklich schwierig über einen einzigen Formatierungsstring auszudrücken (dank der Pluralisierungsregeln, die Sie berücksichtigen müssten), und ich konnte keine _irgendeine_ Bibliothek in einer Sprache finden, die dies zulässt einfache, i18n-freundliche Formatierung von Zeiträumen über 24 Stunden. Das Beste, was Sie tun können, wäre, duration.humanize() zu erweitern, um einige zusätzliche Parameter aufzunehmen, wodurch der ursprüngliche Vorschlag in #463 effektiv implementiert wird.

Kurz gesagt, es ist möglicherweise keine gute Idee, duration.format() zu implementieren, da ich jede potenzielle Lösung mit erheblichen Fallstricken sehe. Am besten verbessern Sie duration.humanize() oder implementieren ein verkleinertes duration.format() , das nur Stunden, Minuten und Sekunden versteht.

+1

Falls Sie eine schnelle Funktion zum Hinzufügen von Padding benötigen:

function padWithZero(input, length) {
    // Cast input to string
    input = "" + input;

    let paddingSize = Math.max(0, length - input.length);
    return new Array(paddingSize > 0 ? paddingSize + 1 : 0).join("0") + input;
}

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

:+1:

:+1: Überraschungsmoment tut das nicht, normalerweise hat es mich nie im Stich gelassen!

+1 Ich habe das oben erwähnte Moment-Dauer-Format verwendet, aber es ist nicht internationalisiert. Ich versuche, Tage auszugeben und werde wahrscheinlich auch Monate brauchen, die wirklich Etiketten brauchen.

Gibt es Fortschritte bei diesem Problem?

+1

+1

+1

+1

:+1:

+1
Warum ist es immer noch nicht im Kern?

+1 +1 +1 +1 +1

+1

+2

@jsmreese unterstützt dein Plugin i18n?

@rumeshwick : vielleicht? Das hängt wirklich davon ab, wie Sie i18n machen und was Sie von meinem Plugin erwarten.

+1

Ich habe herausgefunden, dass es auf diese Art von Hacky möglich ist:

  var dur = moment.duration('PT90M');
  moment(dur._data).format('[it\'s] D [days and] h [hour]');

Dies ergibt:

"es sind 1 tage und 1 stunde"

Sie können jedoch nicht so etwas wie "es sind 1 Tage und 90 Minuten" drucken.
Für meine Zwecke reicht das.
Es enthält kein i18n, aber in meinem Fall möchte ich nicht, dass dies von moment.js gelöst wird.

Hallo, ich habe hier einen Ember.JS-Helfer dafür:

https://github.com/ember-building-blocks/ember-hbs-date-helpers

+1

+1 für die hackige Art von @vanthome :+1:

@jsmreese - wären Sie daran interessiert, Ihr Plugin in Moment Core zusammenzuführen? Es wäre sehr nützlich und sehr zu schätzen.

Es müsste neu formatiert werden, um es an die neue ES6-Implementierung anzupassen, und einige redundante Funktionen müssten durch aktuelle Äquivalente ersetzt werden, aber insgesamt denke ich, dass es ziemlich einfach wäre.

@mj1856 auf jeden Fall interessiert. Ich werde Sie per E-Mail mit ein paar Fragen anpingen.

Yay! Weiter so, @jsmreese und @mj1856!!! :Klatsch Klatsch klatsch:

Ich bin nur hierher gekommen, um vorzuschlagen, das Plugin von @jsmreese mit moment js zusammenzuführen.

+1

+1

Da es so aussieht, als hätte @jsmreese wenig Zeit, markiere ich dies als Up For Grabs. Im Wesentlichen sollte die vorgeschlagene PR alle Funktionen des moment-duration-format- Plug-ins von @jsmreese implementieren, aber dem ES2015-Stil entsprechen, der jetzt in moment.js verwendet wird, und möglichst viel des vorhandenen moment wiederverwenden. js-Funktionalität zur Minimierung der Codegröße.

+1

Eine Funktion, die dem moment-duration-format- Plugin von @jsmreese fehlt, ist die Fähigkeit, ein Dauerobjekt aus der formatierten Zeichenfolge zu konstruieren.

Hey @mj1856 , ich bin daran interessiert, das Format-Plugin in Moment zu integrieren. Wie funktioniert das Beitragen hier mit dem Up-For-Grabs -Label, sollte ich einfach daran arbeiten und die PR an den develop -Zweig senden, oder hat jemand anderes Anspruch darauf erhoben?

@joshrowley es wird nicht behauptet, aber du wärst ein Held, wenn du es hinkriegst. Gehen Sie voran und nehmen Sie es, und wenn Sie bereit sind, reichen Sie einen Zug ein. Dieser wird etwas kniffliger sein als andere zu gewinnende. Wenn Sie also möchten, können Sie gerne einen Pull-Request zur Überprüfung einreichen, bevor Sie fertig sind – wir werden ein Auge darauf haben. Wir werden wählerisch sein, die Größe der Bibliothek mit diesem nicht zu sprengen - es ist bereits größer, als wir möchten. Bitte denken Sie daran.

Vielleicht werde ich das auch (oder stattdessen) handhaben, aber zuerst muss ich mich in die gesamte Entwicklungsstruktur des Moments einfügen.

In Arbeit PR: #3308

Hallo Leute, ich habe eine PR unter #3615 eröffnet und würde mich über ein paar Augen freuen!

vielleicht hängt das damit zusammen - aufgetretene Probleme:
moment.duration(3500000).format("hh:mm", { forceLength: true })
was das Ergebnis anzeigt: 58, anstatt 00:58

http://stackoverflow.com/questions/41443233/using-moment-js-to-display-duration-in-format-00xx-when-duration-is-less-than-a

ms = moment(moment().format(),"YYYY-MM-DD HH:mm:ss").diff(moment(time,"YYYY-MM-DD HH:mm:ss"));
var duration = moment.duration(ms);
moment(duration._data).format("HH:mm");

Noch ein weiterer Hack zum Formatieren von Dauern....

var timeInSeconds = 5000;
var formattedDur = moment("1900-01-01 00:00:00").add(timeInSeconds, 'seconds').format("HH:mm:ss");

+1

Beachten Sie, dass die von @fabiogalera und @befreestudios geposteten Hacks für eine Dauer < 24 Stunden gut zu funktionieren scheinen, aber keiner funktioniert für eine Dauer von mehr als 24 Stunden.

BEARBEITEN: Dies scheint daran zu liegen, dass Sie sich auf einer älteren Version von Moment befinden. Ich habe es gerade nochmal mit der neusten Version probiert und es funktioniert wie erwartet. Sorry für die Verwirrung.
-
Ich habe auch einige seltsame Rundungsfehler/Randfälle mit dem ursprünglichen Hack gefunden, der von @mj1856 oben in diesem Thread gepostet wurde. Versuchen Sie es beispielsweise mit 2,3 oder 4,1 Stunden. Das sind Dezimalwerte, die sich gleichmäßig in eine Anzahl von Minuten aufteilen sollten.

Beispielsweise sollte 2.3 genau 2:18:00 sein, aber Sie erhalten 2:17:59. Und 4.1 sollte genau 4:06:00 sein, aber Sie erhalten 4:05:59. Dies scheint darauf zurückzuführen zu sein, dass die duration.asXXX() -Methoden einige Genauigkeits-/Rundungsprobleme aufweisen. Hat das noch jemand gesehen und irgendwelche Vorschläge?

Hier ist meine Funktion für duration.format basierend auf Date.format (https://gist.github.com/ptquang86/2893903)

moment.duration.fn.format = moment.duration.fn.format || function (mask): string {
            // Some common format strings
            let formatMasks = {
                "default":      "DD MM YYYY HH:mm:ss",
                shortDate:      "M/D/YY",
                mediumDate:     "MM DD, YYYY",
                longDate:       "MM DD, YYYY",
                fullDate:       "DD, MM, YYYY",
                shortTime:      "H:mm TT",
                mediumTime:     "H:mm:ss TT",
                longTime:       "H:mm:ss TT Z",
                isoDate:        "YYYY-MM-DD",
                isoTime:        "hh:mm:ss",
                isoDateTime:    "YYYY-MM-DD'T'hh:mm:ss",
            };

            let format = function () {
                let token = /D{1,2}|M{1,2}|YY(?:YY)?|([HhmsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g;

                function pad(val, len?) {
                    val = String(val);
                    len = len || 2;
                    while (val.length < len) val = "0" + val;
                    return val;
                }

                // Regexes and supporting functions are cached through closure
                return function (date, mask) {
                    mask = String(formatMasks[mask] || mask || formatMasks["default"]);

                    let D = date.days(),
                        m = date.months(),
                        y = date.years(),
                        H = date.hours(),
                        M = date.minutes(),
                        s = date.seconds(),
                        L = date.milliseconds(),
                        flags = {
                            D:    D,
                            DD:   pad(D),
                            M:    m + 1,
                            MM:   pad(m + 1),
                            YY:   String(y).slice(2),
                            YYYY: y,
                            H:    H % 12 || 12,
                            HH:   pad(H % 12 || 12),
                            h:    H,
                            hh:   pad(H),
                            m:    M,
                            mm:   pad(M),
                            s:    s,
                            ss:   pad(s),
                            l:    pad(L, 3),
                            L:    pad(L > 99 ? Math.round(L / 10) : L),
                            t:    H < 12 ? "a"  : "p",
                            tt:   H < 12 ? "am" : "pm",
                            T:    H < 12 ? "A"  : "P",
                            TT:   H < 12 ? "AM" : "PM",
                        };

                    return mask.replace(token, function ($0) {
                        return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
                    });
                };
            }();

            return format(this, mask);
        };

benutze: moment.duration(10000).format("hh:mm:ss:l")

+1

Irgendwelche Neuigkeiten hier, wird Moment diese Funktionalität bekommen? Was ist der Konsens?

+1

Wieder stoßend ist es wie das 4. Projekt, in dem ich eine solche Funktion verwenden wollte. Ich hoffe, dass es sehr bald in moment.js implementiert wird.

+1

Ich habe das lange im Auge behalten und gehofft, dass diese Funktion implementiert wird. Gibt es diesbezüglich irgendwelche Arbeiten?

Soweit ich weiß, funktioniert es gerade, ich habe es in meiner App, überprüfen Sie die Dokumentation:
https://momentjs.com/docs/#/durations/

@luchillo17 Sprichst du allgemein über Dauer, Arbeit?

Nun, ich habe es gerade vor 5 Minuten versucht und es hat funktioniert.

Nun, wollte nur klarstellen, wovon wir hier reden. Dauern funktionieren _do_. In dieser Ausgabe geht es um die Formatierung von Dauern.

Mein Fehler, der Faden ist so groß, dass ich mich auf dem Weg nach unten verlaufen habe.

Aber jetzt, wo ich genauer hinschaue, gibt es ein Plugin für die Formatierung der Momentdauer, das in den Dokumenten aufgeführt ist:
https://momentjs.com/docs/#/plugins/duration -format/

Ist es das, was ihr erhofft? scheint sogar TypeScript-Typdefinitionen zu haben.

Und ich habe es getestet, funktioniert ziemlich gut.

Das Plugin funktioniert sehr gut. Würde gerne sehen, wie es in Moment.js zusammengeführt wird. Ich kann nicht sehen, wie Dauer ohne sie nützlich ist.

Es ist ein Plugin, weil nicht alle Leute Dauer verwenden, ich sehe nicht, dass viele Benutzer Dauer brauchen, um zu rechtfertigen, dass die Codebasis größer wird.

Ich bin sogar überrascht, dass das gesamte Dauermodul nicht in einem Plugin enthalten ist.

Oder das. Derzeit ist das Dauermodul für mich sinnlos. Alle darin enthaltenen Funktionen sind nur einfache Mathematik, die ohne eine Bibliothek gut ausgeführt werden kann.
Wenn das Plugin zusammengeführt wurde, kann ich sehen, dass es eine gute Verwendung hat.

Vielleicht, aber nicht in Mathematik zu denken ist das, wofür Bibliotheken gut sind, kampferprobte Lösungen, damit Sie und ich keine Zeit mit solchen Aufgaben verschwenden müssen, wie zum Beispiel ich nicht wusste, dass es so viele Standards für die Dauer gibt, wie ISO 8601, das Dauermodul erledigt das für mich, also muss ich nicht wissen, wie dieser Standard definiert ist.

Ich denke schon.
In jedem Fall schlage ich vor, dass wir auf das Plugin in der Dokumentation verweisen.
Auf diese Weise wissen die Leute, dass die Funktionalität vorhanden ist, und müssen nicht zu Google gehen und nach dieser Funktionalität suchen.

In der Tat hat es einige Zeit gedauert, bis ich den Plugin-Bereich dafür herausgefunden habe.

4 Jahre und immer noch keine Reaktion der Besitzer... Das ist traurig :(

Hallo Leute,

Daran arbeiten wir noch. Moment ist eine Freiwilligen-Community! Wir müssen sicherstellen, dass eine Funktion wie diese diese Eigenschaften hat:
1) funktioniert in jeder Umgebung
2) fügt dem Code nicht zu viel Masse hinzu
3) erfindet das Rad nicht neu (dh es gibt bereits ein Plugin dafür!)
4) unterbricht keine bestehenden Funktionen

Es ist möglich, dass dies irgendwann zusammengeführt wird.
https://github.com/moment/moment/pull/3615

Wenn Sie der Meinung sind, dass die Dokumente besser auf das Formatierungs-Plugin für die Dauer (oder andere Plugins!) hinweisen könnten, senden Sie uns bitte hier eine PR: https://github.com/moment/momentjs.com/

@marwahaha

fügt dem Code nicht zu viel Masse hinzu
erfindet das Rad nicht neu (dh es gibt bereits ein Plugin dafür!)

Nun, da es bereits ein Plugin für das Dauerformat und eine Dauer in der Moment-Bibliothek gibt, ist es vielleicht die beste Lösung, die Dauer aus moment.js in ein separates Plugin zu entfernen und dann all die "schweren" Dinge in diesem Plugin zu implementieren?
Damit werden 2 Ziele erreicht:
1) Verringern Sie die Größe von moment.js
2) Bieten Sie Dauer direkt mit den nützlichsten Funktionen anstelle einer sehr eingeschränkten Version.

Eine große Herausforderung besteht darin, dass die Formatierung der Dauer in allen von moment.js unterstützten Gebietsschemata nur sehr schwer zu implementieren sein wird.

Ich würde es hassen, wenn diese Gebietsschemas die Unterstützung für begrenzte Dauer verlieren würden, die sie derzeit haben, oder dass Moment eine Funktion hinzufügt, die nur in einigen Gebietsschemas richtig funktioniert. Das Beibehalten der Dauerformatierung in einem Plug-in scheint ein guter Mittelweg zu sein, der sicherstellt, dass der „Kern“ von moment.js stabil ist und für alle funktioniert, während Benutzern mit einem einzigen Gebietsschema die Möglichkeit gegeben wird, Plug-ins zu verwenden, die für ihr Gebietsschema spezifische Funktionen ausführen .

Das Plugin zur Formatierung der Dauer ist bereits vorhanden und wird in der Dokumentation referenziert. Das ist mehr als genug.

@OogieBoogieInJSON Nun, die Dokumentation ist nicht so hilfreich, ich musste dieses Problem im Grunde überprüfen, bevor ich überhaupt zu den Plugins in der Dokumentation kam. Diese Funktionen sind nur wenig bekannt, es sei denn, Sie versuchen tatsächlich, die gesamte Dokumentation zu lesen, was zugegebenermaßen niemand tut.

@ luchillo17 Ich lese alle Dokumente, bevor ich mit irgendetwas arbeite. Wahrscheinlich bin das nur ich.

Haha, ja, es ist großartig, dass du das tust, jeder sollte es tun, aber die meisten von uns als Entwickler haben Zeitpläne zu erfüllen, also ist es nicht praktikabel, jede Nuss und Schraube aller Bibliotheken, die wir verwenden, zu verstehen.

@ luchillo17 Es ist nicht die Schuld der Dokumentation, dass Sie Management-orientierte Programmierung machen. Beifall!

Für diejenigen, die die Saga der Formatierung von Momentdauern verfolgen, habe ich Version 2.0.0 meines Moment-Duration-Format-Plugins veröffentlicht.

Die neue Version löst/berücksichtigt fast alle Probleme und Rückmeldungen aus den letzten vier Jahren, in denen Version 1 in freier Wildbahn war – einschließlich Unterstützung für Lokalisierung und Pluralisierung sowie einige nützliche Formatierungsoptionen.

Sehen Sie es sich hier an: https://github.com/jsmreese/moment-duration-format/releases

Der echte MVP -> @jsmreese

Ha. Danke für die freundlichen Worte, @OogieBoogieInJSON.

Ich kann nicht umhin anzumerken, dass mein Plugin auf den enormen Bemühungen der Ersteller und Betreuer von Moment steht – und ohne sie nicht existieren würde – ganz zu schweigen von den vielen, vielen Mitwirkenden. Dass ich mir jetzt die Zeit nehme, etwas zu überdenken, das ich vor vier Jahren geschaffen habe (wow, ist das wirklich schon so lange her!), verblasst offen gesagt im Vergleich zu ihrer kontinuierlichen Betreuung dieses Projekts!

Aaaaaund Version 2.1.0 ist veröffentlicht.
https://github.com/jsmreese/moment-duration-format/releases

Die aktualisierte Version behebt einige Probleme aus Version 2.0 und führt moment.duration.format ein, eine neue Funktion für die koordinierte Formatierung mehrerer Dauern. Nicht zu verwechseln mit dem bereits existierenden moment.duration.fn.format .

Die neue Funktion nimmt ein Array von Dauern und gibt ein Array von formatierten Zeichenfolgen zurück und ist nützlich, wenn Sie eine Gruppe von Dauern haben, die auf konsistente Weise zusammen formatiert werden müssen.

moment.duration.format([
    moment.duration(1, "second"),
    moment.duration(1, "minute"),
    moment.duration(1, "hour")
], "d [days] hh:mm:ss");
// ["0:00:01", "0:01:00", "1:00:00"]

moment.duration.format([
    moment.duration(1, "minute"),
    moment.duration(1, "day")
], "w [weeks], d [days], h [hours], m [minutes], s [seconds]", { trim: "all" });
// ["0 days, 1 minute", "1 day, 0 minutes"]

@jsmreese 2.0 hat früher zu einigen Fehlern geführt, also musste ich es aus Sicherheitsgründen auf 1.3.0 sperren, trotzdem danke, dass du das Feature/Projekt am Leben erhältst.

@prusswan bitte versuchen Sie es mit Version 2.1.0. Ich würde gerne wissen, ob Sie diese Fehler immer noch sehen!

Ich habe Version 2.2.0 von moment-duration-format veröffentlicht, die jetzt eine Fallback-Zahlenformatfunktion enthält, da toLocaleString in vielen Umgebungen nicht vollständig implementiert ist.

https://github.com/jsmreese/moment-duration-format/releases

Ich habe die neue Version mit BrowserStack auf einer Reihe von Android-Geräten mit Betriebssystemversionen von 2.2 bis 7 und auf einer Reihe von iOS-Geräten mit Betriebssystemversionen von 4.3 bis 11 getestet. Auch getestet auf Chrome, Firefox, IE 8-11, und Edge-Browser.

@prusswan und andere, die die Version auf 1.3.0 sperren mussten, werden Sie wahrscheinlich feststellen, dass Version 2.2.0 endlich der Drop-in-Ersatz ist, der Version 2.0.0 sein sollte.

Vielen Dank an alle, die Probleme mit Version 2 dieses Plugins gemeldet haben!

Nachdem Version 2 des Moment-Duration-Format-Plugins implementiert wurde, gibt es einige offensichtliche Verbesserungen für Version 3.

Ich habe meine Ideen unten aufgelistet und sie als Issues im Repository hinzugefügt. Wenn Sie Ideen oder Kommentare zu dem haben, was Sie sehen möchten, lassen Sie es mich bitte wissen!

Hoffentlich wird die nächste Version in ungefähr 4 Monaten veröffentlicht ... nicht die 4-jährige Wartezeit auf Version 2.

  • Die Lokalisierungsoptionen für die Fallback-Zahlenformatierung sollten in den Moment Locale-Objekterweiterungen enthalten sein, die ich bereits für die Lokalisierung von Beschriftungen für Dauereinheiten erstellt habe. Dadurch würde die gesamte Lokalisierungskonfiguration an einem Ort abgelegt.

  • moment-duration-format und seine Fallback-Zahlenformatierungsfunktion folgen nicht der gleichen API wie Number#toLocaleString für signifikante Ziffern und Fraktionsziffern. Die Fallback-Funktion sollte aktualisiert werden, um die toLocaleString -API zu verwenden, und das Plugin sollte die toLocaleString -API-Optionen direkt verfügbar machen, anstatt einige der Optionen zu verstecken und sie hinter precision und zu maskieren useSignificantDigits Optionen.

  • Die Offenlegung der Fallback-Nummernformatierungsfunktion sowie der toLocaleString -Funktionstestfunktion würde das Testen erleichtern und es ihnen ermöglichen, sie außerhalb des Kontexts der Formatierungsdauer zu verwenden.

  • Fügen Sie Typdefinitionen hinzu, um TypeScript zu unterstützen, veröffentlichen Sie das NuGet-Paket und unterstützen Sie alle anderen Paketierungsoptionen, die heutzutage verwendet werden. (Dies muss nicht bis Version 3 warten.)

  • Das Testen des Plugins sollte modernisiert werden, idealerweise passend zum Test-Setup von Moment.js. (Das muss auch nicht bis Version 3 warten.)

@jsmreese Großartige Arbeit, aber fühle mich absolut nicht unter Druck gesetzt, die Hauptversion innerhalb kurzer Zeit zweimal zu pushen. Wenn es nach 4 Jahren ohne Update immer noch im Einsatz ist, dann ist es wohl meistens gut genug. Ich denke, dass dieses aktuelle Problem geschlossen werden kann, da es bereits eine Lösung gibt (verwenden Sie die Plugins). Ein neues Thema kann gestartet werden, um zu entscheiden, ob diese Funktionalität Teil von moment selbst werden soll.

@jsmreese Erstaunlich. Vielen Dank und gerade noch rechtzeitig! Große Sache für mich und danke für alles, was Sie tun.

Siehe https://momentjs.com/docs/#/ -project-status/

Danke für die ganze Diskussion hier.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

alvarotrigo picture alvarotrigo  ·  3Kommentare

ninigix picture ninigix  ·  3Kommentare

RobinvanderVliet picture RobinvanderVliet  ·  3Kommentare

BCup picture BCup  ·  3Kommentare

benhathaway picture benhathaway  ·  3Kommentare