Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Moment.js how to use fromNow() to return everything in hours?

I've searching the moment.js docs and stackoverflow for a way to use the fromNow() function but returning everything in hours.

What I mean is:

moment([2017, 01, 05]).fromNow();     // a day ago

should be

moment([2017, 01, 05]).fromNow();     // 24 hours ago

I know it's possible to do this using .diff and probably other similar functions and then adding the text, but is it possible to use .fromNow() to do this?

like image 439
Vítor Martins Avatar asked Jan 06 '17 15:01

Vítor Martins


2 Answers

You can use relativeTimeThreshold to customize thresholds for moment relative time.

As the docs says:

duration.humanize has thresholds which define when a unit is considered a minute, an hour and so on. For example, by default more than 45 seconds is considered a minute, more than 22 hours is considered a day and so on. To change those cutoffs use moment.relativeTimeThreshold(unit, limit) where unit is one of s, m, h, d, M.

In your case, you can increase hour thresholds to get relative days as hours. Here a working example showing time as hours from 1 hour to 26 days:

var m1 = moment().subtract(5, 'h');
var m2 = moment().subtract(55, 'h');
var m3 = moment().subtract(1, 'd');

// Default results
console.log(m1.fromNow());
console.log(m2.fromNow());
console.log(m3.fromNow());

// Change relativeTimeThreshold
moment.relativeTimeThreshold('m', 60);
moment.relativeTimeThreshold('h', 24*26);

// Results in hours
console.log(m1.fromNow());
console.log(m2.fromNow());
console.log(m3.fromNow());
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>

Note that, if you need, moment lets you customize relative time further with relativeTime (here one of my examples) and relativeTimeRounding method.

like image 146
VincenzoC Avatar answered Nov 17 '22 09:11

VincenzoC


If you definitely want to use fromNow(), I don't see any way other than overriding moment's built-in function. For example, you can override it to return the difference in hours as follows:

moment.fn.fromNow = function (a) {
    var duration = moment().diff(this, 'hours');
    return duration;
}

Then you can check that fromNow() returns the value in hours:

console.log(moment([2017,0,6]).fromNow());  

which returns:

19

Note: Tried at 19:00 :)

like image 4
Faruk Yazici Avatar answered Nov 17 '22 08:11

Faruk Yazici