如何使用Moment.js在几周内获得持续时间?

Mic*_*ael 8 javascript momentjs

moment.js用来格式化人类可读格式的持续时间.
例如(d是一个Date对象):

moment(d).subtract("days", 3).from(d)  // returns "3 days ago"

现在我想"2周前",但下面的代码会返回以天为单位的持续时间

moment(d).subtract("weeks", 2).from(d) // returns "14 days ago" i/o "2 weeks ago"

如何"2周前"获得moment.js

tim*_*ood 9

您可以使用自定义回调函数轻松完成此操作.

moment.relativeTime.dd = function (number) {
    // round to the closest number of weeks
    var weeks = Math.round(number / 7);
    if (number < 7) {
        // if less than a week, use days
        return number + " days";
    } else {
        // pluralize weeks
        return weeks + " week" + (weeks === 1 ? "" : "s"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/timrwood/sWsXQ/


小智 5

我无法对之前的答案发表评论,但我想留下一个更新的答案(基于timrwood的)

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",
    dd: function (number) {
      var weeks = Math.round(number / 7);
      if (number < 7) {
        // if less than a week, use days
        return number + " days";
      } else {
        // pluralize weeks
        return weeks + " week" + (weeks === 1 ? "" : "s"); 
      }
    },
    M:  "a month",
    MM: "%d months",
    y:  "a year",
    yy: "%d years"
  }
});

$window.moment.relativeTimeThreshold('d', 340); // if you want weeks instead of months, otherwise put a 28 or so.
Run Code Online (Sandbox Code Playgroud)


Jos*_*ter 5

使用新的updateLocale()

Moment.js已再次更新,因此首选方法如下:

moment.updateLocale('en', {

  relativeTime : {
    future: 'in %s',
    past:   '%s ago',
    s:      'a few seconds',
    m:      'a minute',
    mm:     '%d minutes',
    h:      'an hour',
    hh:     '%d hours',
    d:      'a day',
    dd:     function(number) {
              if (number < 7) {
                return number + ' days'; // Moment uses "d" when it's just 1 day.
              }
              else {
                var weeks = Math.round(number / 7);
                return weeks + ' ' + (weeks > 1 ? 'weeks' : 'week');
              }
            },
    M:      'a month',
    MM:     '%d months',
    y:      'a year',
    yy:     '%d years'
  }

});
Run Code Online (Sandbox Code Playgroud)

感谢@timrwood@gahen的回答。

我正在努力更新Moment,以便您可以覆盖单个 relativeTime对象(例如)dd,而不必提供所有对象。

GitHub Issue在这里,所以如果您想做这样的事情,请给它一个大拇指:

moment.updateLocale('en', {

  relativeTime : {
    dd: function(number) {
          if (number < 7) {
            return number + ' days'; // Moment uses "d" when it's just 1 day.
          }
          else {
            var weeks = Math.round(number / 7);
            return weeks + ' ' + (weeks > 1 ? 'weeks' : 'week');
          }
        }
  }

});
Run Code Online (Sandbox Code Playgroud)


Lar*_*off 1

文档列出了创建这些字符串的规则(在“人性化另一时刻的时间”下)。虽然您可以通过更改 来修改字符串moment.relativeTime,但这仅限于数字周围显示的文本,即您不能将天更改为周。

您必须扩展moment.js或编写一些自定义代码才能实现此功能。