Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use "5 days ago (Tue)" if within the last week in moment.js

I'm using moment.js.

The default for relative past days is "5 days ago". But what I want is that if it's within a week ago it should return "5 days ago (Tue)". If it's more than a week, I want the regular "5 days ago".

The docs say I can supply a function to custom format such a thing:

moment.locale('en', {
    relativeTime : {
        future: "in %s",
        past:   "%s ago",
        s:  "seconds",
        m:  "a minute",
        mm: "%d minutes",
        h:  "an hour",
        hh: "%d hours",
        //d:  "a day",   // this is the default
        d:  function(num, noSuffix, key, future) { return "a day (" + FOO + ")"; },
        //dd: "%d days", // this is the default
        dd: function(num, noSuffix, key, future) { return num + "days (" + FOO + ")"; },
        M:  "a month",
        MM: "%d months",
        y:  "a year",
        yy: "%d years"
    }
});

The problems are:

  • How do I calculate the weekday name for variable FOO?
  • It returns e.g. 5 days (Mon) ago instead of 5 days ago (Mon)
  • I want this custom format only if it's <= 7 days (within the last week)
like image 907
h bob Avatar asked Jun 08 '15 06:06

h bob


1 Answers

You can't manipulate the relative time format in the way you asked. However, you can simply do the comparison yourself to decide whether or not to append the additional string.

// your source moment
var m = moment("2015-06-04");

// calculate the number of whole days difference
var d = moment().diff(m,'days');

// create the output string
var s = m.fromNow() + (d >= 1 && d <= 7 ? m.format(" (ddd)") : "");
like image 58
Matt Johnson-Pint Avatar answered Nov 15 '22 13:11

Matt Johnson-Pint