web-dev-qa-db-fra.com

Durées humanisées dans moment.js

J'ai essayé cela en moment.js

moment.duration(375,'days').humanize()

et obtenez "un an" comme réponse, mais je m'attendrais à "un an et 10 jours". Existe-t-il un moyen de récupérer pleinement la valeur humanisée?

40
husayt

J'ai trouvé cette petite bibliothèque, qui affiche uniquement la durée (si vous n'avez pas vraiment besoin de toutes les fonctionnalités de moment.js)

https://github.com/EvanHahn/HumanizeDuration.js

18
Nicolas C

Moment.js fournit la fonction fromNow pour obtenir des durées en lecture, voir http://momentjs.com/docs/#/displaying/fromnow/

Exemple:

moment([2007, 0, 29]).fromNow(); // 4 years ago
moment().subtract(375, 'days').fromNow(); // a year ago

Vous devez utiliser une bibliothèque tierce comme suggéré par @Fluffy

16
Kishore Relangi

J'examinais le même problème et il semble qu'il n'y ait aucun plan pour le soutenir dans le futur ...

Une solution de contournement proposée consiste à créer une définition de langage qui remplace} la mise en œuvre par défaut des messages humanisés:

https://github.com/timrwood/moment/issues/348

Un peu exagéré si vous me demandez ...

9
pflopez

Essayez ce plugin:

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

moment.duration(123, "minutes").format("h [hrs], m [min]");
// "2 hrs, 3 min"
9
Fluffy

Utilisez moment.relativeTimeThreshold('y', 365) pour définir l’arrondi. 

moment.relativeTimeThreshold('s', 60);
moment.relativeTimeThreshold('m', 60);
moment.relativeTimeThreshold('h', 24);
moment.relativeTimeThreshold('d', 31);
moment.relativeTimeThreshold('M', 12);
moment.relativeTimeThreshold('y', 365);
4
RJFalconer

C'est ma solution, je l'aime mieux que les autres ici:

val moment1 = moment();
val moment2 = mement();
console.log(moment.duration(moment1.diff(moment2)).humanize());
3
jhilden

j'ai écrit ce code javascript pour humaniser la durée, 

function humanizeDuration(timeInMillisecond) {
    var result = "";
    if (timeInMillisecond) {
        if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60 * 24 * 30 * 12))) > 0) {//year
            result = result === 1 ? result + " Year" : result + " Years";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60 * 24 * 30))) > 0) {//months
            result = result === 1 ? result + " Month" : result + " Months";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60 * 24))) > 0) {//days
            result = result === 1 ? result + " Day" : result + " Days";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60))) > 0) {//Hours
            result = result === 1 ? result + " Hours" : result + " Hours";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60))) > 0) {//minute
            result = result === 1 ? result + " Minute" : result + " Minutes";
        } else if ((result = Math.round(timeInMillisecond / 1000)) > 0) {//second
            result = result === 1 ? result + " Second" : result + " Seconds";
        } else {
            result = timeInMillisecond + " Millisec";
        }
    }
    return result;
}
1
shyam_

Voici ma solution sur CoffeeScript:

humanizeDuration = (eventDuration)->
    eventMDuration = Moment.duration(eventDuration, 'seconds');
    eventDurationString = ""
    if (eventMDuration.days() > 0)
        eventDurationString += " " + Moment.duration(eventMDuration.days(), 'days').humanize()
    if (eventMDuration.hours() > 0)
        eventDurationString += " " + Moment.duration(eventMDuration.hours(), 'hours').humanize()
    if (eventMDuration.minutes() > 0)
        eventDurationString += " " + Moment.duration(eventMDuration.minutes(), 'minutes').humanize()

    eventDurationString.trim()
0
Ihor Kalashnikov

Ce numéro sur Github contient beaucoup de discussions à ce sujet. Beaucoup demandent une option humanisée plus précise.

Décrivez pourquoi vous en avez besoin, les cas d'utilisation, etc. 

https://github.com/moment/moment/issues/348

0
Joshua Dance