Moment: Dauer fehlende Funktionen

Erstellt am 10. Okt. 2012  ·  186Kommentare  ·  Quelle: moment/moment

Ich arbeite an einem Projekt und momentjs ist wirklich nützlich für die Datumsmanipulation, also danke dafür.

Um Ihnen ein Beispiel zu geben, machen wir ein Geschäft für Flugtickets. Die duration.humanize() -Funktion ist für uns eine Art Ungenauigkeit.

Zum Beispiel, wenn Sie um 12:00 Uhr abreisen und um 13:30 Uhr landen. Es wird auf 2 Stunden gerundet. Aber wir brauchen eine Art Granularität, die in Momenten fehlt.

humanize kann ab dem höchsten Wert standardmäßig 1 Genauigkeitsstufe verwenden.

// 1:30
duration.humanize()
2 hour
duration.humanize({precision: 2})
1 hour 30 minutes
duration.humanize({precision: 3})
1 hour 30 minutes 0 seconds

Das zweite Problem ist, wenn es die Zahl 0 gibt. Momentjs übersetzt es als "wenige Sekunden". Ich bin mir nicht so sicher, wie es erreicht werden könnte, aber es wäre cool, eine Art Formatierung zu haben.

// 3 days and 0 minutes
duration.format('D [and] M')
> 3 days and 0 minutes
duration.format('H [and] M')
> 72 hours and 0 minutes
duration.format('H [and] m')
> 72 hours and few minutes

Auf diese Weise kann der höchste Wert im Format zugeordnet werden. Selbst wenn es 1 Jahr gibt, sagt uns das Format, wie es richtig angezeigt wird. Ich würde gerne ein Commit dafür vorantreiben, weil es sehr nützlich ist und es von Hand tun muss, wenn sich Momente, in denen die Lokalisierung bereits erledigt ist, schlecht anfühlen.

New Feature

Hilfreichster Kommentar

2019 benötigt diese Funktion noch.

Alle 186 Kommentare

+1 auf diese Anfrage

@llacroix , wären Sie daran interessiert, eine Pull-Anfrage dafür zu schreiben?

Ja, wahrscheinlich werde ich versuchen, Zeit dafür zu finden. Das Hinzufügen zu momentjs wird mir und anderen auf lange Sicht wahrscheinlich Zeit sparen. Momentan zwinge mich das, überall eine Art Chaos zu verursachen, und es ist nicht perfekt. Das Beheben von Momenten scheint angemessener zu sein.

Aber wir sollten wahrscheinlich etwas mehr darüber diskutieren, welche Art von Format verwendet werden sollte. Soll beispielsweise 0 Werte angezeigt werden oder nicht.

4 hours 20 seconds oder 0 days 4 hours 0 minutes 20 seconds

Monate wären 30 Tage, ein Jahr 365.

Und welche anderen Formate als Jahr, Monat, Woche, Tag, Minute, Sekunde und Millisekunde sollten existieren.

+1 dafür
Aber ja, die Formatierung ist hier ein zentrales Problem. Humanisieren und Formatieren sind definitiv beide erforderlich.
Einige Vorschläge zur Humanisierung des Verhaltens:
// 1:30
duration.humanize ();
1 Stunde 30 Minuten
duration.humanize ({round: "Stunden"})
2 Stunden
duration.humanize ({Runde: "Minuten"})
1 Stunde 30 Minuten
duration.humanize ({round: "Sekunden"})
1 Stunde 30 Minuten 0 Sekunden

Wenn round nicht explizit definiert ist, denke ich, dass die höchste Einheit, deren Wert Null ist und alle Einheiten, die kleiner als sie sind, weggelassen werden sollten.

// 1 Stunde 0 Minuten 45 Sekunden
duration.humanize () -> 1 Stunde
// 1 Stunde 1 Minuten 0 Sekunden
duration.humanize () -> 1 Stunde und 1 Minute
// 1 Stunde 1 Minuten 10 Sekunden
duration.humanize () -> 1 Stunde 1 Minute und 10 Sekunden

Außerdem sollte das Trennzeichen "und" für den letzten Join verwendet werden, dem Leerzeichen vorangestellt werden
2 Monate 6 Tage 7 Stunden und 36 Minuten

So stelle ich mir vor, dass sich die Funktion standardmäßig verhalten sollte

Hier ist mein Vorschlag für die Signatur und Implementierung.

var duration = moment.duration({
    hours : 1,
    minutes : 0,
    seconds : 20,
    milliseconds : 0
});
duration.countdown(); // 1 hour 0 minutes 20 seconds
duration.countdown(1); // 1 hour
duration.countdown(2); // 1 hour and 0 minutes
duration.countdown(3); // 1 hour 0 minutes and 20 seconds

Wie von @sylvainpolletvillard vorgeschlagen, möchten wir möglicherweise einen Parameter zum Abschneiden von

duration.countdown(3); // 1 hour 0 minutes and 1 second
duration.countdown(3, true); // 1 hour

Möglicherweise möchten wir auch einen Parameter für das Suffix wie moment.fromNow(Boolean) hinzufügen.

duration.countdown(3); // 1 hour 0 minutes and 1 second ago
duration.countdown(3, null, true); // 1 hour ago

Wir können dies für Englisch etwas einfach erstellen, aber es wird sehr schwierig sein, alle diese Zeichenfolgen in allen verschiedenen Sprachen korrekt zu verketten.

Wir müssen wahrscheinlich Rückrufe für Sprachen erstellen, um Zeichenfolgen selbst zu verketten. Diese Regeln werden wahrscheinlich sehr komplex sein (ich sehe dich an, Ungarisch ).

Ich denke, der beste Weg, diese Werte zu übergeben, wäre etwa der folgende.

var keys    = [     "h",        "mm",          "s"],
    values  = [       1,           0,           20],
    strings = ["1 hour", "0 minutes", "20 seconds"];

lang.countdown(keys, values, strings, addSuffix);

Dann wäre die englische Übersetzung ungefähr so:

lang.countdown = function (keys, values, strings, addSuffix) {
    var i, output = "";

    for (i = 0; i < strings.length; i++) {
        if (i === strings.length - 1 && strings.length > 1) {
            output += "and ";
        }
        output += strings[i] + " ";
    }
    if (addSuffix) {
        output += "ago";
    }
}

Alles in allem wird dies zu einer unglaublich komplexen Ergänzung, die 33 Übersetzungsfunktionen und eine Menge mehr Code im Kern erfordern würde. Ich bin mir auch nicht sicher, wie oft es verwendet werden würde, also fügt es all das Aufblähen für alle anderen hinzu.

Vielleicht würde dies am besten in ein Plugin verschoben werden?

Zurück zur Diskussion über die Formatierung der Dauer. Ich denke, es wäre großartig, wenn so etwas möglich wäre.

moment.duration(9483000).format('d h m s') // 1 day 2 hours 20 minutes 30 seconds  
moment.duration(9483000).format('h m s') // 26 hours 20 minutes 30 seconds 
//etc...  

Möglicherweise einen booleschen Parameter in der Formatmethode angeben, um festzustellen, ob 0 Werte angezeigt wurden oder nicht?

CLDR verfügt über ein Listenformatierungsschema und Daten, die möglicherweise für viele Sprachen verwendet werden können. Wahrscheinlich benötigen viele Sprachen jedoch noch benutzerdefinierte Rückrufe:

http://cldr.unicode.org/development/development-process/design-proposals/list-formatting

Ich bin hübsch für die Formatfunktion. Da die Implementierung der Übersetzung mehrerer Sprachen ziemlich schwierig sein kann. Die Verwendung von Formaten sollte recht einfach zu implementieren sein.

Angenommen, Sie möchten

moment.duration(9483000).format('d h m s') // 1 day 2 hours 20 minutes and 30 seconds  
// English  => 'd h m [and] s' 1 day 2 hours 20 minutes and 30 seconds
// French   => 'd, h, m [et] s'   1 jour, 2 heures, 20 minutes et 30 secondes
// Russian  => 'd h m [и] s'   1 день 2 часа 30 минут и 30 секунд

Keine speziellen Rückrufe erforderlich, sondern nur spezielle Formatzeichenfolgen.

Die vorgeschlagenen Methoden duration.countdown() und duration.countdown(1) sind genau das, wonach ich suche (dh was ich jetzt in meinem eigenen Code mache).

Gibt es in der Zwischenzeit eine Möglichkeit, den Duration-Prototyp zu erweitern?

Der Dauer-Prototyp wird über moment.duration.fn angezeigt, ähnlich wie moment.fn .

Ich habe letztes Jahr an etwas Ähnlichem an # 143 / # 192 gearbeitet. Tim schlug ein Plugin vor, aber ich habe mir nie die Zeit dafür genommen.

Ich wollte gerade meine Arbeit neu starten. Ich musste auf neue Konzepte wie Dauerobjekte usw. aktualisieren. Ich war dieses Ticket und andere. Jetzt kämpfe ich darum, ob es noch gebraucht wird und wenn ja, wie sollen wir das umsetzen.

Ich möchte nicht auf die Schuhe treten, damit ich weiß, ob ich helfen kann. Wer arbeitet gerade an diesem Thema?

Mein Code konnte in aufeinanderfolgende Einheiten und nicht aufeinanderfolgende Einheiten wie folgt formatiert werden:

test.equal(moment([2012, 0, 1]).diff([2011, 0, 1], 'years\\y'), "1y");
test.equal(moment([2012, 0, 1]).diff([2011, 0, 1], 'months[m]'), "12m");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'months [months] days [days]'), "50 months 19 days");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years \\y months \\M days \\d'), "4 y 2 M 19 d");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years[y] days[d]'), "4y 80d");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years [years] weeks [weeks]'), "4 years 11 weeks");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years\\y weeks\\w [and] days [days]'), "4y 11w and 3 days");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'days\\d'), "1541d");

Einheiten, die nicht in der richtigen Reihenfolge waren, wie 'days years' , wurden nicht behandelt. Es wurde auch nicht behandelt, Nullwerte zu entfernen.

Das sieht großartig aus, genau das, was ich mir erhofft hatte!

Dies ist definitiv eine notwendige Funktion für alle.

Brauche das!

Als mögliche Notlösung für einige von Ihnen, ich habe ein einfaches Plugin erstellt , die Sie verwenden können countdown.js direkt von Moment:

moment("1982-5-25").countdown().toString(); // => '30 years, 10 months, 14 days, 2 hours, 23 minutes, and 50 seconds'

Es durchläuft alle Countdown-Optionen, die Sie übergeben, z. B. welche Einheiten mit welcher Genauigkeit verwendet werden sollen (Sie können sich die Countdown-Dokumente ansehen). Auf jeden Fall ist das Plugin hier: https://github.com/icambron/moment-countdown

@icambron danke für dein countryibuiton! Es ist sehr hilfreich!

Ich habe gerade angefangen, moment.js zu verwenden und bin ziemlich schnell auf genau dieses Problem gestoßen. Dies ist der Code, mit dem ich es gelöst habe:

moment.duration.fn.format = function (input) {
    var output = input;
    var milliseconds = this.asMilliseconds();
    var totalMilliseconds = 0;
    var replaceRegexps = {
        years: /Y(?!Y)/g,
        months: /M(?!M)/g,
        weeks: /W(?!W)/g,
        days: /D(?!D)/g,
        hours: /H(?!H)/g,
        minutes: /m(?!m)/g,
        seconds: /s(?!s)/g,
        milliseconds: /S(?!S)/g
    }
    var matchRegexps = {
        years: /Y/g,
        months: /M/g,
        weeks: /W/g,
        days: /D/g,
        hours: /H/g,
        minutes: /m/g,
        seconds: /s/g,
        milliseconds: /S/g
    }
    for (var r in replaceRegexps) {
        if (replaceRegexps[r].test(output)) {
            var as = 'as'+r.charAt(0).toUpperCase() + r.slice(1);
            var value = new String(Math.floor(moment.duration(milliseconds - totalMilliseconds)[as]()));
            var replacements = output.match(matchRegexps[r]).length - value.length;
            output = output.replace(replaceRegexps[r], value);

            while (replacements > 0 && replaceRegexps[r].test(output)) {
                output = output.replace(replaceRegexps[r], '0');
                replacements--;
            }
            output = output.replace(matchRegexps[r], '');

            var temp = {};
            temp[r] = value;
            totalMilliseconds += moment.duration(temp).asMilliseconds();
        }
    }
    return output;
}

Merkmale dieses Codes:

d=moment.duration({hours:1,minutes:1,seconds:1});
d.format('HHH:mm:ss');
"001:01:01"
  • Wenn Sie ein Zeichen in Ihrer Eingabevorlage weglassen und der Wert des nachfolgenden Zeichens größer als das übliche Maximum ist, wird das vorherige hinzugefügt, z.
d=moment.duration({days:1, hours:1, minutes: 1});
d.format('H:mm:ss');
"25:01:00"

Mögliche Probleme:

  • verwendet Math.floor für Werte, die von asXxxx erhalten wurden, z.
Math.floor(moment.duration(milliseconds)).asHours()
  • Dies bedeutet, dass wenn es beispielsweise Werte für Minuten oder Sekunden in der Dauer gibt, Sie aber die Formatierungsfunktion für Stunden fragen, diese nicht aufgerundet wird, sondern immer abgerundet wird.

+1 für diese Anfrage

Persönlich halte ich es für sinnvoller, die .format() -Methode zu implementieren, als einige ausgefallene Regeln für .humanize() oder eine .countdown() -Methode zu erstellen. 95% der Probleme können mit .format() gelöst werden.

Ich bin damit einverstanden, dass .humanize() mehr Präzision bieten sollte, aber es sollte eine andere Funktion sein.

Die Formatierungsdauer ist ein Muss. Es sollte einfach sein, Sekunden in formatierte Zeichenfolgen zu übersetzen.

Ich versuche den Stralytic Code aber:
d = moment.duration ({Tage: 1, Stunden: 1, Minuten: 1}); d.Format ('DH: mm: ss');
1 - 215: 01: 00

+1 für format()

Als Anwendungsfall können die in Timing-Prüfungen verwendeten Dauern (3 Stunden) einfach als hh: mm (: ss) oder so formatiert werden, was viel einfacher wäre. Im Moment ist es ziemlich schwierig, dasselbe im Moment zu tun, bis ich mich mit Vanille js beschäftige :)

+1 Dauer Format!

Hier ist die schnelle Lösung, die ich verwendet habe:

moment.duration.fn.format = function(){
    str = ""
    if(this.days() > 1) str = str + Math.floor(this.days()) + "d "
    if(this.hours() > 1) str = str + Math.floor(this.hours()) + "h "
    if(this.minutes() > 1) str = str + Math.floor(this.minutes()) + "m "
    if(this.seconds() > 1) str = str + Math.floor(this.seconds()) + "s "
    return str
    }

: +1: für duration.format()

: +1: auch für duration.format ()

Wie ist der Status dieser PR? Ist es weit weg?

Code Bounty

Ich war eine Weile weg ... Fast ein Jahr, in dem ich diese Ausgabe erstellt habe. Ich werde es versuchen. Ich werde den Moment js teilen und dieses Problem aktualisieren, sobald ich etwas zu testen / zu überprüfen habe. Ich muss mich in zwei Tagen auf eine Prüfung vorbereiten. Es ist also unwahrscheinlich, dass sich innerhalb von zwei Tagen etwas zeigt. Das heißt, ich werde daran arbeiten.

@llacroix Danke :)

: +1: für duration.format ()

 moment.duration.fn.format = Funktion (Nullen, zwei Ziffern) {
 var Stunden = this.hours (), Minuten = this.minutes (), Sekunden = this.seconds ();
 var displayFormat = '', zerosFormat = twoDigit? '00': '0', padLeft = twoDigit? -2: -1;
 if (Stunden || Nullen) {
 displayFormat + = (zerosFormat + Stunden) .slice (padLeft) + 'h';
 }}
 if (Minuten || Nullen) {
 displayFormat + = (zerosFormat + Minuten) .slice (padLeft) + 'min';
 }}
 if (Sekunden || Nullen) {
 displayFormat + = (zerosFormat + Sekunden) .slice (padLeft) + 's';
 }}
 return $ .trim (displayFormat);
 }}

+1 Dauerformat.

+1 Dauer.Format

+1 Dauer.Format

Ich brauchte wirklich eine umfassende Formatierung für die Dauer, also habe ich die Threads hier und auf StackOverflow überprüft und mich heute hingesetzt, um sie zu implementieren.

Ich arbeite noch an ein paar kleinen Details, aber der Kern ist fertig und solide. Ich werde den Code und die Spezifikationen und Beispiele in den nächsten Tagen hier veröffentlichen. Die Grundidee ist, dass Sie eine beliebige Dauer haben und diese mit einer Zeichenfolge formatieren können, die den Zeichenfolgen im Moment-Datumsformat ähnelt, z. Dauer.Format ("d [d] hh: mm: ss") -> 2d 03:47:24

Sie können auch eine beliebige Dezimalgenauigkeit für den Endwert definieren, z. Dauer.Format ("h [hrs]", 3) -> 42,384 h

+1 für Dauer.Format

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

Testfälle und einige Beispiele sind im Projekt.
Mein Plugin ist abhängig von lodash und underscore.string.

+1 duration.format ()

Dieses Ticket wurde vor über einem Jahr eröffnet. Ich bezweifle, dass es jemals umgesetzt wird.

@ Maxwell2022 Ich habe vor ungefähr einer Woche ein moment.duration.format Plugin gepostet:
https://github.com/jsmreese/moment-duration-format

Ist das in Ordnung für dich?

+1 auch dazu. Scheint eine sehr auffällige Auslassung in einer ansonsten umfassenden Bibliothek zu sein.

https://github.com/rmm5t/jquery-timeago könnte eine gute Vorlage dafür sein, wie wir dies in Moment implementieren können ...

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

Funktioniert das für Ihre Anwendungsfälle?

: +1 :!

Dies würde für mich funktionieren (würde aber nicht für> 24 Stunden dauern):

moment.duration.fn.format = function(format) {
  return moment(this.as('milliseconds')).format(format);
}

@jsmreese Ihr https://github.com/jsmreese/moment-duration-format , das von LoDash abhängig ist, ist ein echter Showstopper. Wir verwenden bereits Unterstriche, und ich kann einen Wechsel zu LoDash nur für diese kleine Funktion nicht rechtfertigen. Wenn Ihr Plugin von beiden unabhängig wäre, wäre es für viele Leute eine praktikablere Option, denke ich.

@wleeper Stimme absolut zu.

Meine Umgebung verwendet zufällig LoDash und Underscore.String, daher habe ich Methoden aus diesen Bibliotheken verwendet. Ich brauchte meine erste Version vor ein paar Monaten und wollte sie nur implementieren und veröffentlichen.

Ich werde diese Abhängigkeiten in Kürze entfernen lassen.

@wleeper Underscore und LoDash sollen miteinander kompatibel sein. Solange @jsmreese nichts verwendet, was nicht im Underscore-Build von LoDash enthalten ist, sollten Sie in der Lage sein, sein Plugin unverändert zu verwenden.

@ chall8908 Das ist die Sache, und @wleeper hat recht - ich verwende Funktionen von LoDash, die nicht Teil des Underscore-Builds sind.

Ich habe die Underscore.String-Abhängigkeit entfernt und arbeite an der Underscore-Kompatibilität.

Obwohl das Plugin für das Moment-Dauer-Format eines dieser Probleme löst, denke ich, dass wir einen Ansatz brauchen, der länderübergreifend funktioniert (was zugegebenermaßen viel schwieriger ist).

Ich denke, wir müssen an der Implementierung von # 1241 arbeiten, die viele Türen öffnen würde, um für Menschen lesbare Daten zu relativen Daten, Dauern und Listen in verschiedenen Regionen zu machen. formatDuration wäre ziemlich trivial zu implementieren, wenn Moment Zugriff auf die CLDR-Sprachdaten hätte.

Die Globalize- Bibliothek von jQuery arbeitet an der Lösung vieler der gleichen Probleme, und es erscheint logisch, mit ihnen zusammenzuarbeiten. Twitter hat auch bereits eine sehr umfassende Bibliothek , die vieles davon macht ...

OK, hier ist eine implementierbare API zusätzlich zu CLDR. Was denken Sie?

duration:human(bool) // future/past dep/indep
duration:human({
  with(=min+max): 'hours'|'minutes'|'seconds',
  min: 'hours',
  max: 'days',
  float: bool,
  length: "long|short|narrow",
  abs: bool
})
  • min: Was ist die Mindesteinheit zu verwenden. min: Tage, bedeutet nicht Stunden, Minuten, Sekunden, sondern auf Tage runden, wenn die Dauer kürzer als ein Tag ist
  • max: Was ist die maximal zu verwendende Einheit? max: Tage bedeutet, nicht Monate und Jahre zu verwenden, sondern die jeweilige Anzahl von Tagen
  • Länge: Größe der Token: Tag vs d für Englisch
  • abs: Zukunft / Vergangenheit unabhängig

: +1: +1

: +1:

+1 Dauer.Format

+1 Dauer.Format

+1

+1

+1

Möchte, dass dies die Laufzeit von etwas anzeigt.

+1

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

Moment-Duration-Format Version 1.2.1 wird auf NPM veröffentlicht.
Es ist sowohl in Node.js als auch im Browser funktionsfähig.
Es hängt zwar von Lo-Dash oder Underscore ab, ist aber jetzt mit beiden getestet und funktionsfähig.
Die ursprüngliche Underscore.String-Abhängigkeit wurde entfernt.

Ich werde diese Version in Bower veröffentlichen, sobald die aktuellen Probleme beim Registrieren / Aufheben der Registrierung von Bower-Paketen behoben sind.

+1 für das Dauerformat

Würde es lieben, wenn dies ein Teil der Bibliothek wird.

+1

+1

+1

: +1:

+1 für duration.format ()

+1

Oh ja, ich wäre definitiv dabei, zumindest um moment.duration(3, 'seconds').get('ss') für die Ausgabe mit führenden Nullwerten tun zu können.

Wie ist der Stand dieser Anfrage? Welche Hilfe wird benötigt, um Fortschritte zu erzielen?

@oncletom
Dies existiert: https://github.com/jsmreese/moment-duration-format/
Und kann tun, was Sie wollen, wenn Ihnen die Abhängigkeit von Lo-Dash oder Underscore nichts ausmacht.
Eines Tages werde ich mir etwas Zeit nehmen, um diese Abhängigkeit zu beseitigen ...

war überrascht, dass https://github.com/jsmreese/moment-duration-format/ nicht in stdlib ist, wenn humanize ist. Ich denke, das verstößt gegen das Prinzip der geringsten Überraschung. Zumindest sollte es möglich sein, zu einem einfachen numerischen Format zurückzukehren:

moment.duration(123, "minutes").format();
// "2:03:00"

Im Moment benutze ich:

moment.utc(moment.duration(300 * 1000).asMilliseconds()).format("HH:mm:ss.SSS")
// 00:05:00.000

Würde es lieben, dies bald als Teil von Momenten zu sehen

+1

+1

In einem ähnlichen Zusammenhang gibt duration.toString() [Object object] . Sollte es nicht humanize() ?

+1 würde gerne mehr Kontrolle darüber haben.

+1

Gerade veröffentlichtes Moment Duration Format 1.3.0, das die vorherige Abhängigkeit von Lo-Dash oder Underscore beseitigt. Jetzt ist die einzige Abhängigkeit Moment.js selbst.

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

@jsmreese Netter Mann! :Biere:

@jsmreese cool. !
Warum war das nicht Teil von moment.js selbst, ich verstehe es nicht. Humanisieren ist ohne Präzision nicht so nützlich. Warum sollte ich 1 Stunde und 30 Minuten auf 1 Stunde runden wollen? .. Kein Anwendungsfall dafür.

+1, das Plugin von jsmreese funktioniert hervorragend, wäre aber schön, wenn es Teil von moment.js wäre.

+1. Diese Funktion sollte aktiviert und deaktiviert sein.

+1 für Dauer.Format

@jsmreese hat sein Plugin vor fast einem Jahr veröffentlicht, und diese Ausgabe wurde vor zwei Jahren eröffnet. @timrwood @ichernev Können wir das bitte in die Hauptbibliothek von moment.js aufnehmen?

+1

+1

: +1: für die Dauer

+1

: +1:

+1

Wie ist der aktuelle Stand davon?

Vielleicht wartet der Betreuer, bis wir 1000 oder Silvester erreichen? @icambron

@gkatsanos - Ich bin nicht mehr aktiv bei der Aufrechterhaltung von Moment (und ich war immer nur ein Helfer), aber meine Empfehlung ist eine gut getestete Pull-Anfrage. Sicherlich gibt es jemanden, der dies verlangt und bereit ist, es tatsächlich zu codieren.

@icambron das gibt es schon als Plugin .. was gibt es noch zu tun?
Wer ist übrigens der Betreuer?

@icambron kannst du bitte auf das Plugin verweisen?

und es scheint ein sehr gut geformtes Plugin zu sein. Abgesehen von der Tatsache, dass es von lodash anstelle von underscore abhängt, gibt es noch andere Dinge, die verhindern, dass es als PR gemacht wird. Es scheint der Port von lodash bis underscore sollte nicht so schwierig sein. / cc @jsmreese

@alexanderbeletsky @gkatsanos Eigentlich habe ich vor einiger Zeit die Abhängigkeit von lodash oder underscore .

Eine der größten Hürden für mein Plugin, das in Moment.js Kern enthalten ist, ist das Fehlen einer vollständigen i18n-Unterstützung.

Und das ist mir persönlich ein großes Anliegen. Die Unterstützung mehrerer Sprachen ist eine große Sache für mich, und ich würde es hassen, in eine Situation zu geraten, in der Feature A in jeder Sprache funktioniert, Feature B jedoch nur in Englisch verfügbar ist.

@jsmreese Vielleicht, wenn Sie einige genau definierte Aufgaben in Ihrem Repository erstellen, was genau getan werden muss - ich würde definitiv einspringen, um zu helfen.

@mattgrande @alexanderbeletsky Die Format-Token sind bereits anpassbar, und die Formatvorlage ist beliebig, sodass dies kein Problem darstellt.

Die Standardformatvorlagen sind in keiner Weise lokalisiert, und Sie können weder den Dezimalpunkt lokalisieren noch eine lokalisierte Zahlenformatierung für Werte hinzufügen. Das ist alles, was mir auf den Kopf fehlt.

: +1:

+1 Dauer.Format!

sooo .... was ist der Deal damit?

Schauen Sie einfach vorbei, um ein paar Dinge zu beachten, da es hier ungefähr eine Million Kommentare gibt. Ich bin nicht der Betreuer und nicht mehr in diesem Projekt aktiv, aber ich bin mir zweier Dinge ziemlich sicher:

  1. Jeder, Sie können einfach das Plugin von @jsmreese verwenden . Das sieht großartig aus! Plugins sind gute Dinge! ( @jsmreese , wenn Sie dazu neigen, können Sie es der Liste der Moment-Plugins in der Dokumentation mit einer PR hier hinzufügen: https://github.com/moment/momentjs.com)
  2. Es wird nicht in den Kern von Moment aufgenommen, bis jemand a) es internationalisiert, b) die Tests in die Tests von Moment integriert und c) eine PR einreicht. Es wird definitiv nicht passieren, bis jemand das tut .

+1 Dauer.Format

+1 Dauer.Format!

+1 Dauer.Format

+1 Dauer.Format. Unser Fall ist, dass wir eine Funktion bereitstellen möchten, bei der man eine Anzahl von Sekunden und eine Zeichenfolge übergeben kann, die sie formatieren würde. Im Moment machen wir es mit moment.startof ("w"). Add ("s", nrOfSeconds) .format (customFormatString);

Leider hat dies erst letzte Woche einen Fehler verursacht, da startof ("w") Sonntag ist und am Sonntag Zeit für die Sommerzeit war, sodass wir dort eine Stunde verpasst haben. Natürlich können wir das mit isDSTShifted () überprüfen, aber es wäre trotzdem großartig, eine Dauer nicht in ein Datum konvertieren zu müssen, nur um es zu formatieren.

+1 Dauer.Format

+1 Dauer.Format

+1 für duration.format

+1 für Dauer.Format

Können wir dies schließen, da anscheinend niemand + 1ing diesen Thread tatsächlich liest?

Am Mittwoch, den 10. Juni 2015 um 08:30 Uhr schrieb SamFromDaUk [email protected] :

+1 für Dauer.Format

- -
Antworte direkt auf diese E-Mail oder sieh sie dir auf GitHub an
https://github.com/moment/moment/issues/463#issuecomment -110751635.

ODER, reparieren Sie es?

George, ich denke, diejenigen, die +1 hinzufügen, sind implizit anderer Meinung, und
wollen einfach diese Funktionen.

Wenn Sie durch die Benachrichtigungen irritiert werden, sollten Sie dies abbestellen
Faden.
Am 11. Juni 2015 um 00:07 Uhr schrieb "George Katsanos" [email protected] :

ODER, reparieren Sie es?

- -
Antworte direkt auf diese E-Mail oder sieh sie dir auf GitHub an
https://github.com/moment/moment/issues/463#issuecomment -110767322.

Der ganze Grund, warum Github (nach meinem Verständnis) keine Abstimmungsfunktion hat, ist, dass es die Diskussion entmutigt.

Sie können implizit nicht zustimmen, was Sie wollen, das ist nicht hilfreich. Wenn Sie nicht der Meinung sind, dass dies großartig ist, lesen Sie den Thread durch und geben Sie Ihre Argumente an (insbesondere alle neuen Argumente oder Punkte, die Ihrer Meinung nach schlecht berücksichtigt wurden).

Ich bin immer noch abonniert, weil ich glaube, dass noch einige interessante Argumente vorgebracht werden müssen. Ich freue mich darauf, sie zu hören, aber das Team sollte sich nicht dem bloßen Gruppenzwang beugen.

Ich kann bestätigen, dass das oben erwähnte Plugin

Wenn Sie wie ich sind, möchten Sie ein .fromNow() mit einer breiteren Ausgabe (wie den Versand-Countdown von Amazon). So geht's:

// include the plugin
var cutoffDate = moment().add(3, 'hours'); // some date in the future that we're counting down to
var now = moment();
var output = moment.duration(cutoffDate.diff(now)).format('h [hours] m [minutes] s [seconds]');
// "3 hours 0 minutes 0 seconds"

Ja, ich werde es auch klarstellen - moment.duration (). format () funktioniert mit diesem Plugin: https://github.com/jsmreese/moment-duration-format

Wenn Sie Meteor verwenden, wählen Sie oaf:moment-duration-format

Das scheint bei mir nicht zu funktionieren, ich benutze moment .diff zwischen zwei Mal, was funktioniert. Das Problem ist, wenn es zwischen "pm" und "am" ist, sagen wir, ich reise um 21 Uhr und lande 2 Uhr morgens sollte ich die richtige Zeit bekommen.

@ Markj89 Sie müssen ein Stackoverflow-Thema öffnen.

+1

+1

+1

: +1:

+1 beim Schließen dieser Ausgabe. Die Verwendung des Plugins ist eine solide Lösung.

+1

+1

+1 auf .format()

+1, nach 4 Jahren noch nicht implementiert? : D.

+1

Übrigens. Ich denke, es sollte möglich sein, auch das humanisierte Format zu analysieren. ZB ist es nicht so schwer, 7 days and 5 hours zu analysieren ...

Ich wollte nur betonen, Plugin von @jsmreese großartig funktioniert hat!

: +1:

+1 Dauer.Format

+1 Dauerformat

+1 Dauer.Format

+1 Dauer.Format

: +1:

Ich werde dies zugunsten von # 1048 schließen. Das bedeutet nicht, dass es weg ist. Wir hatten nur zwei Probleme, die mehrere Jahre alt sind und beide darauf hinauslaufen, die Formatierung für die Dauer vorzunehmen. Der andere erklärt dies deutlicher.

+1 Dauer.Format

+1 Dauer.Format

+1

Verwenden Sie .localeData (). RelativeTime (45, true, 'mm') und erhalten Sie 45 Minuten und so weiter;)

+1 Wirklich so viel darüber geredet und doch ist es nicht implementiert. Für dieses https://github.com/jsmreese/moment-duration-format gibt es sogar ein separates Paket

Um die Dauer in einem beliebigen Format anzuzeigen, konvertieren Sie einfach die Dauer in ms und dann in moment:
moment(duration.as('milliseconds')).format('HH:mm:ss')

Vielen Dank! Ist das in den Dokumenten? Ich habe es nicht gesehen ...

Dies ist nicht in den Dokumenten enthalten, da es nicht funktioniert. Es ist ein Hack, der die Unix-Epoche verwendet, um Millisekunden als Zeitpunkt seit der Epoche zu interpretieren. Somit fällt es auseinander, wenn Ihre Dauer 24 Stunden oder mehr beträgt.

Ein paar Dinge zu diesem Code:

  1. Ein hh-Token ist ein Token, das für die Verwendung mit AM / PM vorgesehen ist. Ihre Dauer beträgt also nur bis zu 12

  2. Selbst wenn Sie einen HH-Token verwenden, der bis zu 23 erhöht, kann Ihre Dauer nicht länger als 23: 59: 59.999 sein, da die Dinge auf das nächste Datum übergehen

  3. Da dieser Code geschrieben ist, funktioniert er nur auf einem Server, der sich in UTC befindet. Jeder Browser in einer anderen Zeitzone führt zu unerwarteten Ergebnissen.

Wenn Sie diesen Hack verwenden möchten, sollte er wie folgt geschrieben werden:

moment.utc(duration.as('milliseconds')).format('HH:mm:ss')

Aber wie ich bereits erwähnt habe, funktioniert dies nur, wenn Ihre Dauer unter 24 Stunden liegt. Darüber zurück zu Feld 1.

Vielen Dank. Ich habe heute eine Weile gebraucht, um herauszufinden, dass man .minutes() mit .seconds() verketten kann. Nennen Sie mich dumm, aber es war mir aus den Dokumenten nicht klar, was der Unterschied zwischen .seconds() und .asSeconds() sofort ist ... Aber jetzt sehe ich, dass es tatsächlich da ist! :) :)

Zum Beispiel: console.log(duration.minutes()+":"+duration.seconds());

Ich werde bei dieser Methode bleiben.

@elasticsteve Wahrscheinlich möchten Sie dem Sekundenabschnitt auch eine führende Null hinzufügen, wenn er kleiner als zehn ist. :zwinkern:

@butterflyhug @elasticsteve das ist eigentlich der Hauptgrund, warum ich format . In meinem Fall handelt es sich um einen einfachen Kurzzeitzähler, sodass die Lösung von @maggiepint für meine Anforderungen ausreicht.
moment.utc(duration.asMilliseconds()).format('HH:mm:ss')

@sagivo guter Punkt! Jetzt sieht die @ maggiepint- Lösung ansprechender aus. Mein Server ist sowieso UTC.

Klar, ich verstehe es total. Ich habe diesen Hack auch im Produktionscode verwendet. Aber ich würde es nicht als allgemeine Lösung empfehlen (abgesehen von einigen spezifischen Anwendungsfällen), da es viele Situationen gibt, in denen es schlecht ausfällt. (ZB negative Dauern sind ein weiterer wichtiger Fehlerfall, der noch nicht explizit erwähnt wurde.)

+1

+1 duration.format () !!!!!!!!!

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1 schwer zu debuggende Dauer

+1

Sie können leicht etwas tun wie:

    var duration = moment().add(5, 'days') -  moment().local();
    var s = Math.floor( (duration/1000) % 60 );
    var m = Math.floor( (duration/1000/60) % 60 );
    var h = Math.floor( (duration/(1000*60*60)) % 24 );
    var d = Math.floor( duration/(1000*60*60*24) );
    return d + ' days ' + h + ' hours ' + m + ' minutes ' + s  + ' seconds before the deadline.';   
    // 4 days 23 hours 59 minutes 59 seconds before the deadline.

Fordern Sie einen Benutzer twitter @Toon_Ladyboy

Sie können leicht etwas tun wie:

    var duration = moment().add(5, 'days') -  moment().local();
    var s = Math.floor( (duration/1000) % 60 );
    var m = Math.floor( (duration/1000/60) % 60 );
    var h = Math.floor( (duration/(1000*60*60)) % 24 );
    var d = Math.floor( duration/(1000*60*60*24) );
    return d + ' days ' + h + ' hours ' + m + ' minutes ' + s  + ' seconds before the deadline.';   
    // 4 days 23 hours 59 minutes 59 seconds before the deadline.

Hässlich, aber effektiv.

2019 benötigt diese Funktion noch.

Ein einfacher Parameter in humanize, .eg humanize(precise: true) , der alle Rundungen umgehen würde, würde ausreichen, um alle glücklich zu machen. Außerdem ist das Runden der schwierig zu implementierende Teil. Der Rest ist einfach das Konvertieren einer Dauer wie bei jeder anderen Formatierung mit format ().

Es gibt eine großartige moment -Methode namens fromNow() , die die Zeit einer bestimmten Zeit in einer für Menschen lesbaren Form zurückgibt, wie folgt:

moment('2019-04-30T07:30:53.000Z').fromNow() // an hour ago || a day ago || 10 days ago

Oder wenn Sie das zwischen zwei bestimmten Daten möchten, können Sie verwenden:

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b); // "a day ago"

Aus den Dokumenten entnommen:

Kann dies wieder geöffnet werden? Dies ist eine sehr grundlegende Funktionalität.

In meinem Fall habe ich ein Paket gefunden, das meine Probleme gelöst hat:
https://github.com/EvanHahn/HumanizeDuration.js

Vielleicht ist es auch für jemand anderen nützlich. :) :)

Juli 2019 und diese Funktion noch nicht verfügbar.

Juli 2019 und diese Funktion noch nicht verfügbar.

Ich habe es noch nicht ausprobiert, aber ich habe es gerade bemerkt!
npm install moment-duration-format

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

September 2019 vermissen diese Funktion noch offiziell

d.format('H:mm:ss');
"1:01:01"

Wünschte auch, dass es diese Funktion haben könnte

d.format('D-H:mm:ss'); // existence of D will mod hours to 24
"999-23:59:59"

Falls sich jemand fragte, warum dies geschlossen wurde: https://github.com/moment/moment/issues/463#issuecomment -228543000

Das ist keineswegs ideal, aber ich habe so etwas als Workaround gemacht. Ich hatte ein duration -Objekt mit einem Countdown zum Abmelden des Benutzers nach Inaktivität und wollte die verbleibende Zeit formatieren.

// What I did:
private getTimeString(duration: moment.Duration): string {
    const time = moment()
      .seconds(duration.seconds())
      .minutes(duration.minutes());

    return time.format('mm:ss');
}

// What I'd rather do (as many others have mentioned)...
private getTimeString(duration: moment.Duration): string {
    return duration.format('mm:ss');
}

Eine hackige Lösung von mir:

import moment from 'moment';

const formatInt = (int: number): string => {
  if (int < 10) {
    return `0${int}`;
  }
  return `${int}`;
};

export const formatDuration = (time: string): string => {
  const seconds = moment.duration(time).seconds();
  const minutes = moment.duration(time).minutes();
  const hours = moment.duration(time).hours();
  if (hours > 0) {
    return `${formatInt(hours)}:${formatInt(minutes)}:${formatInt(seconds)}`;
  }
  if (minutes > 0) {
    return `${formatInt(minutes)}:${formatInt(seconds)}`;
  }
  return `00:${formatInt(seconds)}`;
};

2020

Ich benutze die folgende Methode, es kann für jemand anderen nützlich sein :)

function formatDuration(duration, format) {
  const date = moment().startOf('day');
  return date.add(duration).format(format);
}

(Ich verwende nur, um Dauern zwischen 00:00 und 23:59 zu formatieren.)

Brauche das noch

Diese 'get' helfen beim Formatieren wie gewünscht:

  duration.get('years')
  duration.get('months')
  duration.get('days')
  duration.get('hours')
  duration.get('minutes')
  duration.get('seconds')

Womit ich arbeite:

const formatDuration = ms => {
  const days = Math.floor(ms / 8.64e7);
  const msOnLastDay = ms - days * 8.64e7;
  return (days < 10 ? "0" + days : days) + ":" + moment.utc(msOnLastDay).format("HH:mm:ss.SSS");
};
formatDuration(5)
"00:00:00:00.005"
formatDuration(500)
"00:00:00:00.500"
formatDuration(50000)
"00:00:00:50.000"
formatDuration(5000000)
"00:01:23:20.000"
formatDuration(500000000)
"05:18:53:20.000"
// for reference
JSON.stringify(moment.duration(500000000)._data, null, 2)
"{
  "milliseconds": 0,
  "seconds": 20,
  "minutes": 53,
  "hours": 18,
  "days": 5,
  "months": 0,
  "years": 0
}"

Juli 2019 und diese Funktion noch nicht verfügbar.

Ich habe es noch nicht ausprobiert, aber ich habe es gerade bemerkt!
npm install moment-duration-format

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

Das funktioniert einwandfrei :)

Das Spiel ist vorbei :)

Danke, schätze das !!!


De: Aleksey Makas [email protected]
Enviado: sexta-feira, 9 de outubro de 2020 11:03
Para: moment / moment [email protected]
Cc: Douglas Aguiar [email protected] ; Kommentar [email protected]
Assunto: Re: [Moment / Moment] Dauer fehlende Funktionen (# 463)

Das Spiel ist vorbei :)

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/moment/moment/issues/463#issuecomment-706200427 an oder kündigen Sie https://github.com/notifications/unsubscribe-auth/AGD22DRNGNIQMOJFQY7VW3DSJ4Z4C4C4 .

War diese Seite hilfreich?
5 / 5 - 1 Bewertungen