Moment: Durée des fonctionnalités manquantes

Créé le 10 oct. 2012  ·  186Commentaires  ·  Source: moment/moment

Je travaille sur un projet et momentjs est vraiment utile pour la manipulation de date, merci pour cela.

Pour vous donner un exemple, nous faisons une sorte de magasin pour les billets d'avion. La fonction duration.humanize() est une manière imprécise pour nous.

Par exemple en partant à: 12h00 et en atterrissant à 13h30. Il l'arrondira à 2 heures. Mais nous avons besoin d'une sorte de granularité qui manque à momentjs.

humanize pourrait par défaut à 1 niveau de précision à partir de la valeur la plus élevée.

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

Le deuxième problème est quand il y a le nombre 0. Momentjs le traduit par "quelques secondes". Je ne sais pas trop comment cela pourrait être réalisé, mais ce serait cool d'avoir une sorte de formatage.

// 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

De cette façon, la valeur la plus élevée pourrait être mappée dans le format. Donc même s'il y a 1 an, le format nous dit comment l'afficher correctement. Je serais heureux de pousser un commit pour cela car c'est très utile et devoir le faire à la main quand les moments gèrent déjà la localisation se sent mal.

New Feature

Commentaire le plus utile

2019, toujours besoin de cette fonctionnalité.

Tous les 186 commentaires

+1 sur cette demande

@llacroix , seriez-vous intéressé à écrire une pull request pour cela?

Oui probablement, j'essaierai de trouver du temps pour ça. L'ajouter à momentjs me fera probablement gagner du temps à moi et à d'autres à long terme. Actuellement, cela me force à créer une sorte de désordre partout et ce n'est pas parfait. La correction des moments semble plus appropriée.

Mais nous devrions probablement discuter un peu plus du type de format à faire. Par exemple, si les valeurs 0 doivent être affichées ou non.

4 hours 20 seconds ou 0 days 4 hours 0 minutes 20 seconds

Les mois seraient 30 jours, un an 365.

Et quels formats autres que l'année, le mois, la semaine, le jour, la minute, la seconde et la milliseconde devraient exister.

+1 pour cela
Mais oui, le formatage est ici un problème majeur. Humaniser et formater sont définitivement nécessaires.
Quelques suggestions pour humaniser le comportement:
// 1h30
durée.humaniser ();
1 heure 30 minutes
duration.humanize ({round: "hours"})
2 heures
duration.humanize ({round: "minutes"})
1 heure 30 minutes
duration.humanize ({round: "seconds"})
1 heure 30 minutes 0 secondes

Si round n'est pas explicitement défini, je pense que l'unité la plus élevée dont la valeur est zéro et toutes les unités plus petites que celle-ci devrait être omise.

// 1 heure 0 minutes 45 secondes
duration.humanize () -> 1 heure
// 1 heure 1 minutes 0 secondes
duration.humanize () -> 1 heure et 1 minute
// 1 heure 1 minutes 10 secondes
duration.humanize () -> 1 heure 1 minute et 10 secondes

De plus, le séparateur "et" doit être utilisé pour la dernière jointure, précédée d'espaces blancs
2 mois 6 jours 7 heures et 36 minutes

C'est ainsi que j'imagine que la fonction doit se comporter par défaut

Voici ma suggestion pour la signature et la mise en œuvre.

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

Comme @sylvainpolletvillard l'a suggéré, nous souhaitons peut-être ajouter un paramètre pour couper les valeurs mises à zéro. Peut-être quelque chose comme ça.

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

Nous pouvons également vouloir ajouter un paramètre pour le suffixe comme moment.fromNow(Boolean) .

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

Nous pouvons créer cela assez facilement pour l'anglais, mais concaténer correctement toutes ces chaînes dans toutes les langues différentes sera très délicat.

Nous devrons probablement créer des callbacks pour que les langages concaténent eux-mêmes les chaînes. Ces règles seront probablement très complexes (je vous regarde, hongrois ).

Je pense que la meilleure façon de transmettre ces valeurs serait quelque chose comme ce qui suit.

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

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

Ensuite, la traduction anglaise serait quelque chose comme ceci:

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";
    }
}

Dans l'ensemble, cela devient un ajout incroyablement complexe qui nécessiterait 33 fonctions de traduction et un tas de code supplémentaire dans le noyau. De plus, je ne sais pas à quelle fréquence il serait utilisé, donc cela ajoute tout ce ballonnement pour tout le monde.

Peut-être que ce serait mieux déplacé vers un plugin?

Pour en revenir à la discussion sur le formatage de la durée, je pense que ce serait formidable si quelque chose comme ça était possible -

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...  

Peut-être fournir un paramètre booléen dans la méthode de format pour déterminer si 0 valeurs ont été affichées ou non?

CLDR a un schéma de formatage de liste et des données, qui peuvent être utilisés pour de nombreuses langues, mais de nombreuses langues auraient encore besoin de rappels personnalisés:

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

Je suis jolie pour la fonction de format. Depuis la mise en œuvre de la traduction de plusieurs langues peut être assez difficile. L'utilisation de formats devrait être assez simple à mettre en œuvre.

Laisse dire que tu veux

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 секунд

Pas besoin de rappels spéciaux mais juste des chaînes de format spéciales.

Les méthodes duration.countdown() et duration.countdown(1) proposées sont exactement ce que je recherche (c'est-à-dire ce que je fais maintenant dans mon propre code).

En attendant, existe-t-il un moyen d'étendre le prototype Durée?

Le prototype de durée est exposé via moment.duration.fn similaire à moment.fn .

J'ai travaillé sur quelque chose de similaire l'année dernière sur # 143 / # 192. Tim a suggéré un plugin mais je n'ai jamais pris le temps de le faire.

J'étais sur le point de redémarrer mon travail. J'ai dû mettre à jour de nouveaux concepts tels que les objets de durée etc ... J'étais ce ticket et d'autres. Maintenant, je me demande si c'est encore nécessaire et si oui, comment devrions-nous mettre cela en œuvre.

Je ne veux pas marcher sur ses chaussures, alors le met sait si je peux aider. Qui travaille actuellement sur cette question?

Mon code a pu se formater en unités consécutives et en unités non consécutives comme ça:

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");

Il ne traitait pas les unités qui n'étaient pas dans l'ordre comme 'days years' . Il n'a pas non plus géré la suppression des valeurs nulles.

Cela a l'air génial, exactement le genre de chose que j'espérais!

C'est certainement une fonctionnalité nécessaire pour tout le monde.

Besoin de ça!

Comme solution provisoire pour certains d'entre vous, j'ai créé un plugin simple qui vous permet d'utiliser countdown.js directement depuis Moment:

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

Il passe par toutes les options de compte à rebours que vous lui transmettez, comme les unités à utiliser et avec quelle précision (vous pouvez consulter la documentation sur le compte à rebours). Quoi qu'il en soit, le plugin est ici: https://github.com/icambron/moment-countdown

@icambron merci pour votre countribuiton! C'est très utile!

Je viens de commencer à utiliser moment.js et je suis assez rapidement tombé sur ce problème exact. Voici le code que j'ai utilisé pour le résoudre:

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;
}

Caractéristiques de ce code:

  • utilise le même format de caractères que celui décrit à l' adresse :
  • génère autant de zéros non significatifs que vous le souhaitez pour tout attribut de la durée, par exemple:
d=moment.duration({hours:1,minutes:1,seconds:1});
d.format('HHH:mm:ss');
"001:01:01"
  • si vous omettez un caractère dans votre modèle d'entrée et que la valeur du caractère suivant est plus grande que son maximum habituel, il y ajoute le précédent, par exemple:
d=moment.duration({days:1, hours:1, minutes: 1});
d.format('H:mm:ss');
"25:01:00"

Problèmes possibles:

  • utilise Math.floor sur les valeurs obtenues à partir de asXxxx, par exemple:
Math.floor(moment.duration(milliseconds)).asHours()
  • cela signifie que s'il y a, par exemple, des valeurs pour les minutes ou les secondes dans la durée, mais que vous demandez à la fonction de formatage pendant des heures, alors elle ne sera pas arrondie, elle sera toujours arrondie vers le bas.

+1 pour cette demande

Personnellement, je pense qu'il est plus logique d'implémenter la méthode .format() que d'avoir des règles sophistiquées pour .humanize() ou de créer une méthode .countdown() . 95% des problèmes peuvent être résolus avec .format() .

Je suis d'accord que .humanize() devrait offrir plus de précision, mais ce devrait être une fonctionnalité différente.

La durée de formatage est un must. Il devrait être facile de traduire les secondes dans une chaîne formatée.

J'essaye le code stralytique mais:
d = moment.duration ({jours: 1, heures: 1, minutes: 1}); d.format («DH: mm: ss»);
«1 -215: 01: 00»

+1 pour format()

En guise de cas d'utilisation, les durées utilisées dans les examens de chronométrage (3 heures) peuvent être formatées facilement en hh: mm (: ss) ou plus, ce qui serait beaucoup plus facile. En ce moment, il est assez difficile de faire la même chose dans Moment jusqu'à ce que je touche vanilla js :)

+1 format de durée!

voici la solution rapide que j'ai utilisée:

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: pour duration.format()

: +1: pour duration.format () aussi

Quel est le statut de ce PR? Est-ce loin?

Code Bounty

Je suis absent depuis un moment ... Presque un an que j'ai créé ce numéro. Je vais essayer. Je vais bifurquer moment js et mettre à jour ce problème dès que j'ai quelque chose à tester / revoir. Je dois me préparer à un examen dans deux jours. Il est donc peu probable que quelque chose apparaisse dans les deux jours. Cela dit, je vais y travailler.

@llacroix Merci :)

: +1: pour duration.format ()

 moment.duration.fn.format = fonction (zéros, deux chiffres) {
 var heures = this.hours (), minutes = this.minutes (), seconds = this.seconds ();
 var displayFormat = '', zerosFormat = twoDigit? '00': '0', padLeft = twoDigit? -2: -1;
 if (heures || zéros) {
 displayFormat + = (zerosFormat + heures) .slice (padLeft) + 'h';
 }
 if (minutes || zéros) {
 displayFormat + = (zerosFormat + minutes) .slice (padLeft) + 'min';
 }
 if (secondes || zéros) {
 displayFormat + = (zerosFormat + secondes) .slice (padLeft) + 's';
 }
 return $ .trim (displayFormat);
 }

+1 format de durée.

+1 durée.format

+1 durée.format

J'avais vraiment besoin d'un formatage complet de la durée, alors j'ai examiné les fils ici et sur StackOverflow et je me suis assis aujourd'hui pour le mettre en œuvre.

Je travaille encore sur quelques détails mineurs, mais le noyau est fait et solide. Je vais afficher le code, les spécifications et les exemples ici dans les prochains jours. L'idée de base est que vous pouvez avoir n'importe quelle durée arbitraire et la formater avec une chaîne similaire aux chaînes de format de date moment, par exemple. duration.format ("d [d] hh: mm: ss") -> 2d 03:47:24

Vous pouvez également définir une précision décimale arbitraire sur la valeur finale, par exemple. duration.format ("h [h]", 3) -> 42,384 h

+1 pour duration.format

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

Des cas de test et quelques exemples sont dans le projet.
Mon plugin dépend de lodash et de underscore.string.

+1 durée.format ()

Ce billet a été ouvert il y a plus d'un an maintenant. Je doute qu’elle ne soit jamais mise en œuvre.

@ Maxwell2022 J'ai posté un plugin moment.duration.format il y a environ une semaine:
https://github.com/jsmreese/moment-duration-format

Cela fonctionnera-t-il pour vous?

+1 à cela également. Cela semble être une omission très notable dans une bibliothèque par ailleurs complète.

https://github.com/rmm5t/jquery-timeago pourrait être un bon modèle pour savoir comment nous pouvons l'implémenter dans Moment ...

@schmod J'ai posté un plugin moment.duration.format le mois dernier:
https://github.com/jsmreese/moment-duration-format

Cela fonctionne-t-il pour vos cas d'utilisation?

: +1:!

Cela fonctionnerait pour moi (mais pas pour des durées> 24h):

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

@jsmreese votre https://github.com/jsmreese/moment-duration-format étant dépendant de LoDash est un véritable showstopper. Nous utilisons déjà des traits de soulignement, et je ne peux pas justifier un passage à LoDash juste pour cette petite fonctionnalité. Si votre plugin était indépendant des deux, cela en ferait une option plus viable pour beaucoup de gens, je pense.

@wleeper Absolument d'accord.

Mon environnement utilise LoDash et Underscore.String, donc j'ai utilisé des méthodes de ces bibliothèques - j'avais besoin de ma première version il y a quelques mois et je voulais juste l'implémenter et la voir.

Je vais bientôt supprimer ces dépendances.

@wleeper Underscore et LoDash sont censés être intercompatibles. Tant que @jsmreese n'utilise rien d'autre dans la version Underscore de LoDash, vous devriez pouvoir utiliser son plugin tel quel sans aucun problème.

@ chall8908 C'est le problème, et @wleeper a raison - je _am_ utilise des fonctionnalités de LoDash qui ne font pas partie de la version Underscore.

J'ai supprimé la dépendance Underscore.String et je travaille sur la compatibilité Underscore.

Bien que le plugin de format moment-durée résout l'un de ces problèmes, je pense que nous avons besoin d'une approche qui fonctionne à travers les locales (ce qui est, certes, beaucoup plus difficile).

Je pense que nous devons travailler sur la mise en œuvre du # 1241, ce qui ouvrirait beaucoup de portes en termes de rendu des dates lisibles par l'homme, des dates relatives, des durées et des listes à travers les paramètres régionaux. formatDuration serait assez simple à implémenter si Moment avait accès aux données du langage CLDR.

La bibliothèque bibliothèque très complète qui fait beaucoup de ce genre de chose ...

OK, voici une API implémentable en plus de CLDR. Qu'est-ce que tu penses?

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: quelle est l'unité minimale à utiliser. min: jours, signifie ne pas dire heures, minutes, secondes, mais arrondir aux jours si la durée est inférieure à un jour
  • max: quelle est l'unité maximale à utiliser. max: jours, signifie ne pas utiliser les mois et les années, mais plutôt le nombre de jours respectif
  • longueur: taille des jetons: jour vs d pour l'anglais
  • abs: futur / passé indépendant

: +1: +1

: +1:

+1 durée.format

+1 durée.format

+1

+1

+1

Voudrait que cela affiche le temps d'exécution de quelque chose.

+1

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

La version 1.2.1 au format moment-durée est publiée sur NPM.
Il est fonctionnel à la fois dans Node.js et dans le navigateur.
Cela dépend de Lo-Dash ou Underscore, mais est maintenant testé et fonctionnel avec les deux.
La dépendance d'origine Underscore.String a été supprimée.

Je publierai cette version sur Bower dès que les problèmes actuels d'enregistrement / désinscription du paquet Bower seront résolus.

+1 pour le format de durée

J'adorerais que cela fasse partie de la bibliothèque.

+1

+1

+1

: +1:

+1 pour duration.format ()

+1

Oh oui, je serais certainement dedans, au moins pour pouvoir faire moment.duration(3, 'seconds').get('ss') pour sortir avec des valeurs nulles en tête.

Quel est l'état de cette demande? De quelle aide a-t-on besoin pour progresser?

@oncletom
Cela existe: https://github.com/jsmreese/moment-duration-format/
Et pouvez faire ce que vous voulez, si cela ne vous dérange pas la dépendance à Lo-Dash ou Underscore.
Un jour, je prendrai bientôt le temps de supprimer cette dépendance ...

a été surpris que https://github.com/jsmreese/moment-duration-format/ ne soit pas dans stdlib lorsque humanize est. Je pense que cela viole le principe de la moindre surprise. À tout le moins, revenir à un format numérique simple devrait être possible:

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

Pour l'instant j'utilise:

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

J'adorerais voir cela bientôt dans le cadre de moments.js

+1

+1

Dans le même ordre d'idées, duration.toString() renvoie [Object object] . Ne devrait-il pas renvoyer humanize() ?

+1 aimerait avoir plus de contrôle sur cela.

+1

Je viens de publier Moment Duration Format 1.3.0, qui supprime la dépendance précédente sur Lo-Dash ou Underscore. Maintenant, la seule dépendance est Moment.js lui-même.

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

@jsmreese Bel homme! :bières:

@jsmreese cool. !
Pourquoi cela n'a-t-il pas fait partie de moment.js lui-même, je ne comprends pas. humaniser n'est pas si utile sans précision, pourquoi voudrais-je arrondir 1h et 30minutes à 1 heure? .. Pas de cas d'usage pour ça.

+1, le plugin de jsmreese fonctionne à merveille mais ce serait bien s'il faisait partie de moment.js.

+1. Cette fonctionnalité devrait être intégrée et humanisée.

+1 pour duration.format

@jsmreese a publié son plugin il y a près d'un an, et ce numéro a été ouvert il y a deux ans. @timrwood @ichernev Pouvons-nous

+1

+1

: +1: pour duration.format

+1

: +1:

+1

Quelle est la situation actuelle de cela?

Peut-être que le responsable attend jusqu'à ce que nous atteignions 1000, ou le réveillon du Nouvel An? @icambron

@gkatsanos - Je ne suis plus actif pour aider à maintenir Moment (et j'ai toujours été juste un assistant), mais ma recommandation est une pull request bien testée. Il y a sûrement quelqu'un qui le demande et qui est prêt à le coder.

@icambron cela existe déjà en tant que plugin .. que reste-t-il à faire?
qui est le responsable btw?

@icambron pouvez-vous indiquer le plugin?

et cela semble être un plugin très bien formé. sauf le fait que cela dépend de lodash au lieu de underscore , y a-t-il d'autres choses qui empêchent d'en faire un PR .. semble être le port de lodash à underscore ne devrait pas être si difficile. / cc @jsmreese

@alexanderbeletsky @gkatsanos En fait, j'ai supprimé la dépendance lodash ou underscore quelque temps.

L'un des principaux obstacles à l'inclusion de mon plugin dans le noyau de Moment.js est le manque de prise en charge complète de i18n.

Et c'est une préoccupation majeure pour moi, personnellement. Les multiples langues prises en charge sont une grande chose pour moi, et je détesterais me retrouver dans une situation où la fonctionnalité A fonctionne dans n'importe quelle langue, mais la fonctionnalité B est uniquement en anglais.

@jsmreese peut-être si vous créez des tâches bien définies dans votre référentiel, de ce qui doit être fait exactement - je serais certainement prêt à vous aider.

@mattgrande @alexanderbeletsky Les jetons de format sont déjà personnalisables et le modèle de format est arbitraire, ce n'est donc pas un problème.

Les modèles de format par défaut ne sont en aucun cas localisés et vous ne pouvez pas localiser la virgule décimale ou ajouter une sorte de formatage de nombre localisé sur les valeurs. C'est tout ce qui manque au sommet de ma tête.

: +1:

+1 durée.format!

sooo .... quel est le problème avec ça?

Je viens de noter quelques points, car il y a un million de commentaires ici. Je ne suis pas le mainteneur et je ne suis plus actif dans ce projet, mais je suis assez sûr de deux choses:

  1. Tout le monde, vous pouvez simplement utiliser le plugin @jsmreese . Cela semble très bien! Les plugins sont de bonnes choses! ( @jsmreese , si vous êtes si enclin, vous pouvez l'ajouter à la liste des plugins Moment dans la documentation avec un PR ici: https://github.com/moment/momentjs.com)
  2. Il ne sera pas inclus dans le noyau de Moment jusqu'à ce que quelqu'un a) l'internationalise, b) intègre les tests dans les tests de Moment, et c) soumette un PR. Cela n'arrivera certainement pas tant que quelqu'un n'aura

+1 durée.format

+1 durée.format!

+1 durée.format

+1 durée.format. Notre cas est que nous voulons fournir une fonction où l'on peut passer un nombre de secondes et une chaîne qui les formaterait. En ce moment, nous le faisons avec moment.startof ("w"). Add ("s", nrOfSeconds) .format (customFormatString);

Malheureusement, la semaine dernière, cela a produit une erreur car startof ("w") est dimanche et dimanche, il était temps pour l'heure d'été, nous manquions donc une heure. Bien sûr, nous pouvons vérifier cela avec isDSTShifted () mais ce serait toujours génial de ne pas avoir à convertir une durée en date juste pour la formater.

+1 durée.format

+1 durée.format

+1 pour duration.format

+1 pour duration.format

Pouvons-nous fermer cela car apparemment personne + 1ing ne lit réellement ce fil?

Le mercredi 10 juin 2015, 08:30 SamFromDaUk [email protected] a écrit:

+1 pour duration.format

-
Répondez directement à cet e-mail ou affichez-le sur GitHub
https://github.com/moment/moment/issues/463#issuecomment -110751635.

OU, le réparer?

George, je pense que ceux qui ajoutent des +1 sont implicitement en désaccord, et
veulent simplement ces fonctionnalités.

Si les notifications vous irritent, envisagez de vous désabonner de ce
fil.
Le 11 juin 2015 à 00:07, "George Katsanos" [email protected] a écrit:

OU, le réparer?

-
Répondez directement à cet e-mail ou affichez-le sur GitHub
https://github.com/moment/moment/issues/463#issuecomment -110767322.

La raison pour laquelle github n'a pas de fonction de vote (d'après ce que je comprends) est que cela décourage la discussion.

Vous pouvez implicitement être en désaccord tout ce que vous voulez, ce n'est pas utile. Si vous n'êtes pas d'accord, c'est bien, lisez le fil de discussion et donnez vos arguments (en particulier, tout nouvel argument ou tout point que vous pensez avoir été mal pris en compte).

Je suis toujours abonné parce que je pense qu'il reste des arguments intéressants à faire, j'ai hâte de les entendre, mais l'équipe ne devrait pas céder à la simple pression des pairs.

Je peux confirmer que le plugin @icambron mentionné ci-dessus fonctionne.

Si vous êtes comme moi, vous voulez un .fromNow() avec une sortie plus large (comme le compte à rebours d'expédition d'Amazon). Voici comment procéder:

// 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"

oui, je le préciserai également - moment.duration (). format () fonctionne avec ce plugin: https://github.com/jsmreese/moment-duration-format

si vous utilisez meteor, optez pour oaf:moment-duration-format

Cela ne semble pas fonctionner pour moi, j'utilise moment .diff entre deux heures, ce qui fonctionne, le problème est quand il est entre "pm" et "am", disons que je voyage à 21 heures et que j'atterris 2h du matin, je devrais avoir la bonne quantité de temps.

@ Markj89 vous devez ouvrir une rubrique stackoverflow.

+1

+1

+1

: +1:

+1 en fermant ce problème. l'utilisation du plugin est une solution solide.

+1

+1

+1 sur .format()

+1, toujours pas mis en œuvre après 4 ans? :RÉ

+1

Btw. Je pense qu'il devrait être possible d'analyser également le format humanisé. Par exemple, il n'est pas si difficile d'analyser 7 days and 5 hours ...

Je voulais juste souligner que le plugin de @jsmreese fonctionnait très bien!

: +1:

+1 durée.format

+1 format de durée

+1 durée.format

+1 durée.format

: +1:

Je vais clore cela en faveur de # 1048. Cela ne veut pas dire que c'est parti, nous avons juste eu deux problèmes qui datent de plusieurs années et qui se résument tous deux à «faire le formatage de la durée». L'autre explique cela plus clairement.

+1 durée.format

+1 durée.format

+1

Utilisez .localeData (). RelativeTime (45, true, 'mm') et obtenez 45 minutes, et ainsi de suite;)

+1 On en parle vraiment beaucoup et pourtant ce n'est pas implémenté. Il existe même un package séparé pour ce https://github.com/jsmreese/moment-duration-format

pour afficher la durée dans n'importe quel format, convertissez simplement la durée en ms puis en moment:
moment(duration.as('milliseconds')).format('HH:mm:ss')

Merci! Est-ce dans la documentation? Je ne l'ai pas vu ...

Ce n'est pas dans la documentation car cela ne fonctionne pas. C'est un hack utilisant l'époque unix pour interpréter les millisecondes comme un point dans le temps depuis l'époque. Ainsi, il s'effondre si votre durée est de 24 heures ou plus.

Quelques petites choses à propos de ce code:

  1. Un jeton hh est un jeton destiné à être utilisé avec AM / PM, donc votre durée ne passera que jusqu'à 12

  2. Même si vous utilisez un jeton HH, qui ira jusqu'à 23, votre durée ne peut pas être supérieure à 23: 59: 59.999, car les choses passeront à la date suivante

  3. Au fur et à mesure que ce code est écrit, il ne fonctionnera que sur un serveur en UTC. Tout navigateur dans un fuseau horaire différent donnera des résultats inattendus.

Si vous souhaitez utiliser ce hack, il doit être écrit comme suit:

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

Mais comme je l'ai souligné, cela ne fonctionnera que si votre durée est inférieure à 24 heures. Sur cela, revenons à la case 1.

Merci. Il m'a fallu un certain temps aujourd'hui pour comprendre que l'on peut concaténer .minutes() avec .seconds() . Appelez-moi stupide, mais il n'était pas évident pour moi à partir de la documentation quelle est la différence entre .seconds() et .asSeconds() tout de suite ... Mais maintenant je vois que c'est vraiment là! :)

par exemple: console.log(duration.minutes()+":"+duration.seconds());

Je vais m'en tenir à cette méthode.

@elasticsteve Vous voudrez probablement également ajouter un zéro non

@butterflyhug @elasticsteve c'est en fait la raison principale pour laquelle je voulais utiliser format . dans mon cas, c'est un simple compteur de temps court donc la solution de @maggiepint est suffisante pour mes besoins.
moment.utc(duration.asMilliseconds()).format('HH:mm:ss')

@sagivo bon point! Désormais, la solution @maggiepint semble plus attrayante. Mon serveur est de toute façon UTC.

Bien sûr, je comprends totalement. J'ai également utilisé ce hack dans le code de production. Mais je ne le recommanderais pas comme solution générale (à l'exception de quelques cas d'utilisation spécifiques), car il y a beaucoup de situations où cela échoue gravement. (Par exemple, les durées négatives sont un autre cas d'échec important qui n'a pas encore été explicitement mentionné.)

+1

+1 durée.format () !!!!!!!!!

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1 durées difficiles à déboguer

+1

Vous pouvez facilement faire quelque chose comme:

    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.

Demander un utilisateur Twitter @Toon_Ladyboy

Vous pouvez facilement faire quelque chose comme:

    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.

Moche, mais efficace.

2019, toujours besoin de cette fonctionnalité.

Un simple paramètre dans humanize, .eg humanize(precise: true) , qui contournerait tous les arrondis suffirait à rendre tout le monde heureux. De plus, l'arrondi est la partie la plus difficile à mettre en œuvre. Le reste est simplement une simple conversion d'une durée comme tout autre formatage effectué avec format ().

Il existe une excellente méthode moment appelée fromNow() qui retournera l'heure d'un moment spécifique sous une belle forme lisible par l'homme, comme ceci:

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

Ou si vous le souhaitez entre deux dates spécifiques, vous pouvez utiliser:

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

Tiré de la documentation:

Cela peut-il être rouvert? C'est une fonctionnalité très basique.

Dans mon cas, j'ai trouvé un package qui a résolu mes problèmes:
https://github.com/EvanHahn/HumanizeDuration.js

Peut-être que cela est également utile pour quelqu'un d'autre. :)

Juillet 2019 et cette fonctionnalité n'est toujours pas disponible.

Juillet 2019 et cette fonctionnalité n'est toujours pas disponible.

Je n'ai pas encore essayé, mais je viens de le remarquer!
npm install moment-duration-format

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

Septembre 2019 manque encore officiellement cette fonctionnalité

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

Souhaite également qu'il puisse avoir cette fonctionnalité

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

Au cas où quelqu'un se demanderait pourquoi cela a été fermé: https://github.com/moment/moment/issues/463#issuecomment -228543000

Ce n'est en aucun cas idéal, mais j'ai fini par faire quelque chose comme ça comme solution de contournement. J'avais un objet duration avec un compte à rebours pour déconnecter l'utilisateur après l'inactivité, et je voulais formater le temps restant.

// 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');
}

Une de mes solutions hacky:

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

J'utilise la méthode suivante, cela peut être utile à quelqu'un d'autre :)

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

(Je n'utilise que pour formater des durées entre 00h00 et 23h59)

J'ai encore besoin de ça

Ces 'get' vous aident à formater comme vous le souhaitez:

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

Avec quoi je travaille:

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
}"

Juillet 2019 et cette fonctionnalité n'est toujours pas disponible.

Je n'ai pas encore essayé, mais je viens de le remarquer!
npm install moment-duration-format

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

Cela fonctionne parfaitement bien :)

Le jeu est terminé :)

Merci, appréciez ça !!!


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] ; Commentaire [email protected]
Assunto: Re: [moment / moment] Durée caractéristiques manquantes (# 463)

Le jeu est terminé :)

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, visualisez-le sur GitHub https://github.com/moment/moment/issues/463#issuecomment-706200427 , ou désabonnez-vous https://github.com/notifications/unsubscribe-auth/AGD22DRNGNIQMOJFQY7VW3DSJ4J4VANCUZN .

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