Moment: formatage de la durée

Créé le 5 sept. 2013  ·  118Commentaires  ·  Source: moment/moment

Nous en avons déjà parlé dans les numéros 463 et 879, mais nous n'en avons jamais vraiment parlé directement dans son propre numéro.

Nous avons besoin d'une méthode de formatage des durées similaire à la façon dont nous formatons les dates. Cela devrait être aussi simple que :

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

Notez que les jetons de formatage devraient avoir une signification légèrement différente, puisque nous représentons une durée écoulée plutôt qu'une heure de la journée. Je suggère ce qui suit :

  • hh signifierait "heures restantes après comptabilisation des jours"
  • h serait la forme à un chiffre de hh
  • HH signifierait "nombre total d'heures entières"
  • H serait la forme à un chiffre de HH
  • HHH signifierait "nombre total d'heures, y compris les décimales" - bien que cela puisse actuellement être fait avec duration.asHours() , donc cela pourrait ne pas être nécessaire.

Un formatage similaire s'appliquerait aux autres unités. Dans ce contexte, l'unité la plus élevée serait une "journée", qui serait une journée standard composée de 24 heures standard. Cela n'aurait aucun sens de mesurer des années ou des mois avec cela en raison de problèmes de calendrier.

Remarque, cela est apparu récemment (encore) sur StackOverflow dans cette question . L'utilisateur cherchait quelque chose comme duration.format("H:mm:ss") . Voici la solution :

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

Cela fonctionne, mais cela semble hacky. Cela devrait être intégré.

New Feature Up-For-Grabs

Commentaire le plus utile

Ne vaut-il pas mieux faire

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

à la place de

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

Tous les 118 commentaires

+1

moment.duration(x).format("H:mm:ss") était exactement ce à quoi je m'attendais, avant de comprendre que ça ne marcherait pas. La solution de contournement suggérée par Matt a bien fonctionné, mais en comparant avec l'élégance d'autres choses en un instant, cela semble certainement hacky.

Ne vaut-il pas mieux faire

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

à la place de

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

Code Bounty

@RobinvdVleuten - Le problème avec l'utilisation de HH dans le formateur actuel est qu'il représente l'heure _portion_ d'une date et d'une heure complètes. Lorsqu'il s'agit d'un temps _elapsed_, il pourrait bien y avoir 24 heures ou plus. Essayez de passer 24 heures et vous verrez qu'il est remis à zéro.

Je l'ai remarqué en effet. J'utilise maintenant les millisecondes calculées pour le formater, mais c'est toujours une solution de contournement hacky.

Pensez-vous qu'il n'y aura qu'un seul "niveau" de reste possible - par exemple, aucun moyen de dire "des heures après avoir comptabilisé des mois" ? Je pense que c'est une limitation parfaitement raisonnable, mais juste pour cracher une seconde, je pourrais imaginer fournir un argument "d'ancrage", comme ceci:

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

Ce qui nous dit que les heures doivent être modulo le mois. L'ancre est facultative et prendrait par défaut la plus grande unité plus une taille au-dessus (dans ce cas, les jours). De même, il pourrait utiliser la chaîne elle-même pour déterminer que les minutes sont modulo les heures et les secondes modulo les minutes. Alors que si vous faisiez ceci :

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

...les secondes seraient modulo les heures.

Ce n'est probablement pas une bonne idée - ce n'est pas réglé (où vont les semaines dans cette hiérarchie ?) Et c'est probablement inutile (il est peu probable que les gens veuillent des trous comme ça). Mais amusant à penser.

Sur une note plus sérieuse, comment allez-vous gérer les mois par rapport aux minutes avec cette notation minuscule/majuscule ?

J'imaginais que les jours seraient la taille maximale de l'unité, donc les mois n'entreraient pas en ligne de compte. Fondamentalement, c'est l'inverse de la façon dont nous analysons les durées provenant des périodes asp.net.

Logique.

J'ai lu un document SCORM 2004 RTE (p77), et j'ai trouvé que pour la représentation de l'intervalle de temps est la suivante, je pense que cela vient d'un standar,

en théorie je peux passer une valeur comme : P34H
et les analyseurs doivent interpréter cela comme 1 jour et 10 heures

j'espère qu'il pourrait être possible de formater la sortie dans cet esprit
comme 'PHM'
et le formateur interprète cela comme le nombre total d'heures de minutes restantes ?
je voudrais pouvoir formater la sortie comme HH: MM

j'espère que ces informations sont utiles

timeinterval (second, 10,2) : L'intervalle de temps (second, 10, 2) indique que la valeur de
l'élément de modèle de données timeinterval représente le temps écoulé avec une précision de 0,01
secondes[1]. La liaison de notation par points SCORM définit un format particulier pour un
chaîne de caractères pour représenter un intervalle de temps.
Le format de la chaîne de caractères doit être le suivant :
P[yY][mM][dD][T[hH][nM][s[.s]S]] où :
• y : le nombre d'années (entier, >= 0, non limité)
• m : le nombre de mois (entier, >=0, non limité)
• d : le nombre de jours (entier, >=0, non limité)
• h : le nombre d'heures (entier, >=0, non limité)
• n : le nombre de minutes (entier, >=0, non limité)
• s : nombre de secondes ou fraction de seconde (réel ou entier, >=0, non
limité). Si des fractions de seconde sont utilisées, SCORM restreint davantage la chaîne à
un maximum de 2 chiffres (par exemple, 34,45 – valide, 34,45454545 – non valide).
• Les désignateurs de caractères littéraux P, Y, M, D, T, H, Mand S doivent apparaître si le
la valeur non nulle correspondante est présente.
• Le remplissage à zéro des valeurs doit être pris en charge. Le zéro-padding ne change pas le
valeur entière du nombre représenté par un ensemble de caractères. Pour
Par exemple, PT05H est équivalent à PT5H et PT000005H.
Exemple:
• P1Y3M2DT3H indique une période de temps de 1 an, 3 mois, 2 jours et 3 heures
• PT3H5M indique une période de temps de 3 heures et 5 minutes

Les responsables de la mise en œuvre doivent être conscients que le format et la liaison sont destinés à la communication de
les données entre un SCO et un LMS. Étant donné que le format représente une période de temps,
alors une durée comme PT5M équivaut à PT300S.
Si l'élément de modèle de données, c'est-à-dire de type timeinterval(second,10,2) contient une valeur, alors
• L'indicatif Pdoit être présent ;
• Si la valeur des années, mois, jours, heures, minutes ou secondes est zéro, la valeur
et la désignation littérale de caractère correspondante peuvent être omises, mais au moins un
le désignateur littéral de caractère et la valeur doivent être présents en plus du désignateur
P;
• L'indicatif T est omis si toutes les composantes du temps (heures, minutes
et secondes) ne sont pas utilisés. Une valeur zéro peut être utilisée à tout moment
composants (par exemple, PT0S).

Le formatage de la durée serait un excellent ajout. Il n'y a pas besoin de deux jetons "heure" distincts. Supposons une durée de 32 heures. Vous ne voudriez jamais extraire seulement 8 heures sans extraire également 1 jour.

Je pense que @icambron a une bonne suggestion. Analysez la chaîne de format en jetons et exprimez la durée en termes d'unité la plus grande. Analysez les jetons un par un dans l'ordre (par exemple, "DD:hh:ss" signifie nombre de jours complets, nombre d'heures complètes après prise en compte des jours, nombre de secondes complètes après prise en compte des jours + heures).

J'ai posté un plugin moment.duration.format :
https://github.com/jsmreese/moment-duration-format

Je pense que cela répond à la plupart des idées / cas d'utilisation de ce fil.

@jsmreese Avez-vous envisagé de déposer une demande d'extraction contenant votre plugin en tant que partie essentielle de momentjs ?

@hotzenklotz Oui, j'ai envisagé de déposer une demande d'extraction.

Je ne l'ai pas fait à cause de toutes les raisons @icambron exposées au #1538.

Mon plugin :

  • dépend de Lo-Dash
  • ne ressemble pas au code Moment.js
  • utilise une configuration de test complètement différente

J'adorerais que mon plugin fasse partie du noyau de Moment.js... mais je ne vais pas perdre leur temps avec une demande d'extraction avant que ces problèmes ne soient résolus.

Nous voudrions également nous assurer que le code peut être internationalisé. Heureusement, la plupart des chaînes dont nous aurions besoin se trouvent dans le CLDR Unicode, donc très peu de travail de traduction devrait être nécessaire.

Le CLDR a également des recommandations spécifiques aux paramètres régionaux sur la façon de formater certains types d'intervalles, qui pourraient potentiellement être plus utiles que les formats de durée arbitraires. Je ne sais pas comment cela s'intègre ici, mais il peut être agréable de pouvoir afficher automatiquement des intervalles spécifiques aux paramètres régionaux entre deux heures spécifiques.

Le CLDR contient également des informations sur la façon d'afficher des intervalles de temps spécifiques (plutôt que des durées) qui pourraient être utiles à un moment donné...

Données de calendrier en anglais (États-Unis)

Vient de publier une nouvelle version de Moment Duration Format qui supprime la dépendance précédente sur Lo-Dash ou Underscore.

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

@jsmreese Convient parfaitement à nos besoins. Merci!

+1

+1

+1

+1

+1

+1

+1

+1

J'ai probablement l'air d'un disque rayé sur ce problème, mais je voudrais m'assurer que toute solution suit les conventions existantes dans la mesure du possible et peut facilement être internationalisée (ce qui inclut l'ajout de symboles similaires à LLLL pour les formats de durée couramment utilisés .

Un peu ennuyeux, le CLDR ne fournit pas beaucoup de directives spécifiques pour les durées de formatage, bien qu'il existe de nombreuses directives relatives à la durée et à l'intervalle qui pourraient être utiles à un moment ailleurs. Cependant, ils fournissent des directives et des traductions minimales pour les unités de durée , ce qui vous permettrait de concaténer les unités pertinentes lors de la mise en œuvre de quelque chose comme humanize() .

La syntaxe hh / h décrite ci-dessus ressemble à un écart significatif par rapport aux jetons de formatage utilisés par ISO8601, CLDR et Apache , et je préférerais l'éviter si possible.

Une meilleure proposition pourrait être de déduire d'utiliser l'unité la plus significative dans le modèle de formatage comme modulo, donc h:mm:ss afficherait une heure "normale", mais compterait les heures après 24 (par exemple 26:30:00). On ne sait pas comment on pourrait même calculer un modèle comme "HH:MM:ss" , ou quel serait le cas d'utilisation pour cela. Permettre aux développeurs de remplacer ce comportement semble également pouvoir facilement devenir une source de bogues.

Dans l'esprit de "i18n partout", le CLDR définit des formats de durée pour :

  • Heures + minutes ( h:mm en EN-US)
  • Heures + minutes + seconde ( h:mm:ss en EN-US)
  • Minutes + secondes ( m:ss en EN-US)
    et il peut être judicieux de fournir des constantes spécifiques aux paramètres régionaux (similaires aux formats de date LLL ) pour ces durées.

Malheureusement, les durées de formatage avec des unités supérieures aux heures sont vraiment difficiles à exprimer via une seule chaîne de formatage (grâce aux règles de pluralisation que vous devez prendre en compte), et je n'ai pas pu trouver _any_ bibliothèque dans n'importe quelle langue qui permet formatage facile et compatible i18n des durées supérieures à 24 heures. Le mieux que vous puissiez faire serait d'étendre duration.humanize() pour prendre quelques paramètres supplémentaires, implémentant ainsi la proposition originale dans #463.

En bref, ce n'est peut-être pas une bonne idée d'implémenter duration.format() , car je vois toute solution potentielle avoir des pièges considérables. Votre meilleur pari serait d'améliorer duration.humanize() ou d'implémenter un duration.format() réduit qui ne comprend que les heures, les minutes et les secondes.

+1

Si vous avez besoin d'une fonction rapide pour ajouter du rembourrage :

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: le moment de surprise ne fait pas ça, généralement ça ne m'a jamais manqué !

+1 J'ai utilisé le format moment-durée, indiqué ci-dessus, mais il n'est pas internationalisé. J'essaie de produire des jours et j'aurai probablement besoin de mois également, ce qui a vraiment besoin d'étiquettes.

Y a-t-il des progrès avec ce problème?

+1

+1

+1

+1

:+1:

+1
pourquoi n'est-il toujours pas dans le noyau?

+1 +1 +1 +1 +1

+1

+2

@jsmreese votre plugin prend-il en charge i18n ?

@rumeshwick : peut-être ? Cela dépend vraiment de la façon dont vous faites i18n et de ce que vous attendez de mon plugin.

+1

J'ai découvert que c'est possible de ce genre de manière hacky:

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

Cela donne :

"c'est 1 jours et 1 heure"

Vous ne pouvez cependant pas imprimer quelque chose comme "c'est 1 jours et 90 minutes".
Pour mes besoins, cela suffit.
Il n'inclut pas i18n mais dans mon cas, je ne veux pas que cela soit résolu par moment.js.

Salut, ayez un assistant Ember.JS ici pour cela:

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

+1

+1 pour la manière hacky de @vanthome :+1:

@jsmreese - seriez-vous intéressé par la fusion de votre plugin dans moment core ? Ce serait très utile et très apprécié.

Il faudrait le reformater pour s'adapter à la nouvelle implémentation ES6 et remplacer certaines fonctions redondantes par l'équivalent du moment, mais dans l'ensemble, je pense que ce serait assez facile.

@ mj1856 définitivement intéressé. Je vous enverrai un ping par e-mail avec quelques questions.

Yay! Bravo, @jsmreese et @mj1856 !!! :Clap clap clap:

Je suis venu ici juste pour proposer de fusionner le plugin de @jsmreese avec moment js.

+1

+1

Puisqu'il semble que @jsmreese manque de temps, je marque cela comme Up For Grabs. Essentiellement, le PR proposé devrait implémenter toutes les fonctionnalités du plugin moment-duration-format de @jsmreese , mais devrait être conforme au style ES2015 actuellement utilisé dans moment.js, et devrait réutiliser autant de moment existant. js pour minimiser la taille du code.

+1

Une fonctionnalité qui manque au plugin moment-duration-format de @jsmreese est la possibilité de reconstruire un objet de durée à partir de la chaîne formatée.

salut @ mj1856 , je suis intéressé par l'intégration du plugin de format dans moment. Comment la contribution fonctionne-t-elle ici avec l'étiquette Up-For-Grabs ? Dois-je simplement travailler dessus et soumettre le PR à la branche develop , ou quelqu'un d'autre l'a-t-il réclamé ?

@joshrowley , ce n'est pas revendiqué, mais vous seriez un héros si vous le faisiez. Allez-y et prenez-le, et lorsque vous êtes prêt, soumettez un pull. Celui-ci sera un peu plus délicat que les autres à gagner, donc si vous le souhaitez, n'hésitez pas à soumettre une demande d'extraction pour examen avant d'avoir terminé - nous garderons un œil dessus. Nous serons pointilleux pour ne pas exploser la taille de la bibliothèque avec celle-ci - elle est déjà plus grande que nous ne le souhaiterions. Veuillez en tenir compte.

Peut-être que je vais gérer cela aussi (ou à la place), mais je dois d'abord m'intégrer à la structure de développement du moment entier.

Travaux en cours CP : #3308

Salut les gens, j'ai ouvert un PR au # 3615 et j'aimerais avoir quelques yeux dessus !

peut-être est-ce lié - problèmes rencontrés :
moment.duration(3500000).format("hh:mm", { forceLength: vrai })
qui affiche le résultat : 58, au lieu de 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");

Encore un autre hack pour formater les durées....

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

+1

Notez que les hacks postés par @fabiogalera et @befreestudios semblent bien fonctionner pour des durées < 24 heures, mais aucun ne fonctionne pour des durées supérieures à 24 heures.

EDIT: Cela semble être dû au fait d'être sur une ancienne version de moment. Je viens de réessayer avec la dernière version et cela fonctionne comme prévu. Désolé pour la confusion.
-
J'ai également trouvé des erreurs d'arrondi/cas de bord étranges avec le hack original posté par @ mj1856 en haut de ce fil. Par exemple, essayez 2,3 ou 4,1 heures. Ce sont des valeurs décimales qui doivent être divisées uniformément en un certain nombre de minutes.

Par exemple, 2.3 devrait être exactement 2:18:00 mais vous obtiendrez 2:17:59. Et 4.1 devrait être exactement 4:06:00, mais vous obtiendrez 4:05:59. Cela semble être dû au fait que les méthodes duration.asXXX() ont des problèmes de précision/d'arrondi. Quelqu'un d'autre a-t-il vu cela et a-t-il des suggestions?

Voici ma fonction pour duration.format basée sur 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);
        };

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

+1

Des nouvelles ici, obtiendront-elles momentanément cette fonctionnalité ? Quel est le consensus ?

+1

En cogner encore c'est comme le 4ème projet où je voulais utiliser une telle fonction. J'espère le voir implémenté dans moment.js très bientôt.

+1

Je surveille cela depuis longtemps en espérant que cette fonctionnalité sera implémentée. Y a-t-il des travaux en cours à ce sujet ?

Pour autant que je sache, cela fonctionne en ce moment, je l'ai dans mon application, consultez les documents :
https://momentjs.com/docs/#/durations/

@luchillo17 Tu parles des durées, en général, de travail ?

Eh bien, je viens d'essayer 5 minutes en arrière et cela fonctionnait.

Eh bien, je voulais juste être clair sur ce dont nous parlons ici. Les durées fonctionnent. Ce problème concerne le formatage des durées.

Mon mauvais, le fil est si gros que je me suis perdu en descendant.

Cependant, maintenant que je regarde de plus près, il existe un plugin pour le formatage de la durée du moment répertorié dans la documentation :
https://momentjs.com/docs/#/plugins/duration-format/

C'est ce que vous espérez ? semble avoir même des définitions de type TypeScript.

Et je l'ai testé, ça marche plutôt bien.

Le plugin fonctionne très bien. J'adorerais le voir fusionné avec Moment.js. Je ne vois pas comment les durées sont utiles sans cela.

C'est un plugin parce que tout le monde n'utilise pas la durée, je ne vois pas beaucoup d'utilisateurs avoir besoin de durées pour justifier d'agrandir la base de code.

Je suis même surpris que tout le module de durée ne soit pas dans un plugin.

Ou ça. Actuellement, le module de durée ne me sert à rien. Toutes les fonctions qu'il contient ne sont que des calculs simples qui peuvent être effectués très bien sans bibliothèque.
Si le plugin a été fusionné, je peux le voir avoir une bonne utilisation.

Peut-être, mais ne pas penser que les mathématiques sont bonnes pour les bibliothèques, des solutions testées au combat pour que vous et moi n'ayons pas à perdre de temps sur de telles tâches, comme par exemple je ne savais pas qu'il y avait autant de normes de durée, comme ISO 8601, le module des durées s'en charge pour moi, donc je n'ai pas besoin de savoir comment cette norme est définie.

Je suppose.
Dans tous les cas, je propose de référencer le plugin dans la documentation.
De cette façon, les gens savent que la fonctionnalité est là et n'ont pas besoin de s'adresser à Google pour rechercher cette fonctionnalité.

En effet, il m'a fallu un certain temps pour découvrir la section plugin pour cela.

4 ans et toujours aucune réaction des propriétaires... C'est dommage :(

Salut les gens,

C'est quelque chose sur lequel nous travaillons encore. Moment est une communauté de bénévoles ! Nous devons nous assurer qu'une fonctionnalité comme celle-ci a ces propriétés :
1) fonctionne dans tous les environnements
2) n'ajoute pas trop de volume au code
3) ne réinvente pas la roue (c'est-à-dire qu'il existe déjà un plugin pour faire ça !)
4) ne casse pas les fonctionnalités existantes

Il est possible que cela fusionne à un moment donné.
https://github.com/moment/moment/pull/3615

Si vous pensez que la documentation pourrait mieux pointer vers le plugin de formatage de durée (ou d'autres plugins !), veuillez nous envoyer un PR ici : https://github.com/moment/momentjs.com/

@marwahaha

n'ajoute pas trop de volume au code
ne réinvente pas la roue (c'est-à-dire qu'il existe déjà un plugin pour le faire !)

Eh bien, puisqu'il existe déjà un plug-in de format de durée et une durée dans la bibliothèque de moments, la meilleure solution consiste peut-être à supprimer la durée de moment.js dans un plug-in séparé, puis à implémenter tous les éléments "lourds" à l'intérieur de ce plug-in ?
Ce faisant, 2 objectifs seront atteints :
1) diminuer la taille de moment.js
2) fournir une durée directement avec les fonctionnalités les plus utiles au lieu d'une version très limitée.

Un grand défi est que le formatage de la durée sera très difficile à mettre en œuvre dans toute la gamme de paramètres régionaux pris en charge par moment.js.

Je détesterais voir ces paramètres régionaux perdre le support de durée limitée dont ils disposent actuellement, ou pour Moment ajouter une fonctionnalité qui ne fonctionne correctement que dans certains paramètres régionaux. Garder le formatage de la durée dans un plugin semble être un bon compromis qui garantit que le "noyau" de moment.js est stable et fonctionne pour tout le monde, tout en donnant aux utilisateurs de paramètres régionaux uniques la possibilité d'utiliser des plugins qui exécutent des fonctions spécifiques à leurs paramètres régionaux .

Le plugin de formatage de durée existe déjà et est référencé dans la documentation. C'est plus que suffisant.

@OogieBoogieInJSON Eh bien, les docs ne sont pas très utiles, je devais essentiellement vérifier ce problème avant même d'accéder aux plugins dans les docs, il y a peu d'exposition à ces fonctionnalités à moins que vous n'essayiez réellement de lire l'intégralité des docs, ce que personne ne fait.

@ luchillo17 Je lis tous les documents avant de travailler avec quoi que ce soit. Probablement, c'est juste moi.

Haha, ouais, c'est super que vous le fassiez, tout le monde devrait le faire, mais la plupart d'entre nous, en tant que développeurs, avons des horaires à respecter, donc comprendre chaque détail de toutes les bibliothèques que nous utilisons n'est pas pratique.

@ luchillo17 Ce n'est pas la faute de la documentation si vous faites de la programmation orientée gestion. Acclamations!

Pour ceux qui suivent la saga du formatage des durées de moment, j'ai publié la version 2.0.0 de mon plugin moment-duration-format.

La nouvelle version résout / intègre presque tous les problèmes et les commentaires des quatre dernières années, la version 1 a été dans la nature - y compris la prise en charge de la localisation et de la pluralisation ainsi que certaines options de formatage utiles.

Découvrez-le ici : https://github.com/jsmreese/moment-duration-format/releases

Le vrai MVP -> @jsmreese

Ha. Merci pour les aimables paroles, @OogieBoogieInJSON.

Je ne peux pas m'empêcher de noter que mon plugin repose sur - et n'existerait pas sans - les énormes efforts des créateurs et mainteneurs de moment, sans parler des très nombreux contributeurs. Le fait que je prenne maintenant le temps de revisiter quelque chose que j'ai créé il y a quatre ans (wow, ça fait vraiment si longtemps !) est franchement pâle par rapport à leur accompagnement continu de ce projet !

Aaaaaand la version 2.1.0 est publiée.
https://github.com/jsmreese/moment-duration-format/releases

La version mise à jour corrige quelques problèmes de la version 2.0 et introduit moment.duration.format , une nouvelle fonction pour le formatage coordonné de plusieurs durées. À ne pas confondre avec le moment.duration.fn.format déjà existant.

La nouvelle fonction prend un tableau de durées et renvoie un tableau de chaînes formatées. Elle est utile chaque fois que vous avez un groupe de durées qui doivent être formatées ensemble de manière cohérente.

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 a conduit à quelques erreurs plus tôt, j'ai donc dû le verrouiller sur 1.3.0 pour des raisons de sécurité, néanmoins merci d'avoir maintenu la fonctionnalité/le projet en vie.

@prusswan , veuillez essayer la version 2.1.0. J'aimerais savoir si vous voyez toujours ces erreurs !

J'ai publié la version 2.2.0 de moment-duration-format, qui inclut désormais une fonction de format de nombre de secours car toLocaleString n'est pas entièrement implémenté dans de nombreux environnements.

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

J'ai testé la nouvelle version à l'aide de BrowserStack sur une gamme d'appareils Android avec des versions de système d'exploitation de 2.2 à 7, et sur une gamme d'appareils iOS avec des versions de système d'exploitation de 4.3 à 11. Également testé sur Chrome, Firefox, IE 8-11, et les navigateurs Edge.

@prusswan et d'autres qui ont dû verrouiller la version sur 1.3.0 , vous constaterez probablement que la version 2.2.0 est enfin le remplacement instantané que la version 2.0.0 était censée être.

Merci à tous ceux qui ont signalé des problèmes avec la version 2 de ce plugin !

Après avoir implémenté la version 2 du plugin moment-duration-format, il y a quelques améliorations évidentes pour une version 3.

J'ai répertorié mes idées ci-dessous et les ai ajoutées en tant que problèmes sur le référentiel . Si vous avez des idées ou des commentaires sur ce que vous aimeriez voir, n'hésitez pas à me le faire savoir !

Espérons que la prochaine version sera publiée dans quelque chose comme 4 mois... pas les 4 ans d'attente pour la version 2.

  • Les options de localisation de la mise en forme des nombres de secours doivent être incluses avec les extensions d'objet Moment Locale que j'ai déjà créées pour localiser les étiquettes d'unité de durée. Cela mettrait toute la configuration de localisation en un seul endroit.

  • moment-duration-format et sa fonction de formatage de numéro de secours ne suivent pas la même API que Number#toLocaleString pour les chiffres significatifs et les chiffres de faction. La fonction de secours doit être mise à jour pour utiliser l'API toLocaleString , et le plug-in doit exposer directement les options de l'API toLocaleString plutôt que de masquer certaines des options et de les masquer derrière precision et Options useSignificantDigits .

  • L'exposition de la fonction de formatage des nombres de secours ainsi que de la fonction de test de fonctionnalité toLocaleString faciliterait les tests et permettrait de les utiliser en dehors du contexte des durées de formatage.

  • Ajoutez des définitions de type pour prendre en charge TypeScript, publiez le package NuGet et prenez en charge toutes les autres options d'emballage utilisées de nos jours. (Cela n'a pas à attendre la version 3.)

  • Les tests du plugin doivent être modernisés, idéalement pour correspondre à la configuration de test Moment.js. (Cela ne doit pas non plus attendre la version 3.)

@jsmreese Un travail énorme, mais ne vous sentez absolument pas obligé de modifier la version majeure deux fois en peu de temps. S'il est toujours utilisé après 4 ans sans mise à jour, il est probablement assez bon. Je pense que ce problème actuel peut être fermé car il existe déjà une résolution (utilisez les plugins). Un nouveau problème peut être lancé pour décider si cette fonctionnalité doit faire partie du moment lui-même.

@jsmreese Incroyable. Merci beaucoup et juste à temps ! Enorme pour moi et merci pour tout ce que vous faites.

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

Merci pour toute la discussion ici.

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