Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Moment.js获得以周为单位的持续时间?_Javascript_Momentjs - Fatal编程技术网

Javascript 如何使用Moment.js获得以周为单位的持续时间?

Javascript 如何使用Moment.js获得以周为单位的持续时间?,javascript,momentjs,Javascript,Momentjs,我使用moment.js将持续时间格式化为人类可读的格式。 例如(d是一个Date对象): 矩(d).从(d)中减去(“天”,3).返回“3天前” 现在我想得到“2周前”,但下面的代码返回以天为单位的持续时间 moment(d).subtract("weeks", 2).from(d) // returns "14 days ago" i/o "2 weeks ago" 矩(d).从(d)中减去(“周”,2).返回“14天前”i/o“2周前” 如何使用moment.js获取“2周前”?列出了创建

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

矩(d).从(d)中减去(“天”,3).返回“3天前” 现在我想得到“2周前”,但下面的代码返回以天为单位的持续时间

moment(d).subtract("weeks", 2).from(d) // returns "14 days ago" i/o "2 weeks ago" 矩(d).从(d)中减去(“周”,2).返回“14天前”i/o“2周前” 如何使用
moment.js
获取“2周前”?

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


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

您可以使用自定义回调函数轻松实现此功能

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"); 
    }
}
moment.relativeTime.dd=函数(编号){
//四舍五入到最接近的周数
var weeks=数学四舍五入(数字/7);
如果(数字<7){
//如果少于一周,则使用天
返回编号+天数;
}否则{
//多周
返回周数+“周数”+(周数===1?”:“s”);
}
}

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

moment.locale('en'{
相对时间:{
未来:“在%s中”,
过去:“%s以前”,
s:“秒”,
m:“一分钟”,
mm:“%d分钟”,
h:“一小时”,
hh:“%d小时”,
d:“一天”,
dd:功能(编号){
var weeks=数学四舍五入(数字/7);
如果(数字<7){
//如果少于一周,则使用天
返回编号+天数;
}否则{
//多周
返回周数+“周数”+(周数===1?”:“s”);
}
},
M:“一个月”,
MM:“%d个月”,
y:“一年”,
yy:“%d年”
}
});
$window.moment.relativeTimeThreshold('d',340);//如果你想要几周而不是几个月,那么就换成28周左右。

分享和希望仍然有用:

var aPastDate = moment().subtract(5,'months');
var now = moment();


moment.fn.durationInWeeks = function (fromDate, toDate) {

   var weeks =  toDate.diff( fromDate, 'weeks' );
   return weeks + ' weeks ago'; //your own format

}

moment().durationInWeeks(aPastDate,now);

//"21 weeks ago"
使用新的
updateScale()
。 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'
  }

});

改进@vinjenzo的答案,当您需要几周内的日期差异时,您很可能会遇到返回的天数:

var aPastDate = moment().subtract(5,'months');
var aPastDay = moment().subtract(6,'days');
var now = moment();

moment.fn.durationInWeeks = function(fromDate, toDate) {

    var days    = toDate.diff(fromDate, 'days');    
    var weeks   = toDate.diff(fromDate, 'weeks');

    if (weeks === 0) {
        return days + ' ' + (days > 1 ? 'days' : 'day');
    } else {
        return weeks + ' ' + (Math.round(days / 7) > 1 ? 'weeks' : 'week');
    }

}

moment().durationInWeeks(aPastDate,now); // 21 weeks
moment().durationInWeeks(aPastDay,now);  // 6 days
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');
          }
        }
  }

});
var aPastDate = moment().subtract(5,'months');
var aPastDay = moment().subtract(6,'days');
var now = moment();

moment.fn.durationInWeeks = function(fromDate, toDate) {

    var days    = toDate.diff(fromDate, 'days');    
    var weeks   = toDate.diff(fromDate, 'weeks');

    if (weeks === 0) {
        return days + ' ' + (days > 1 ? 'days' : 'day');
    } else {
        return weeks + ' ' + (Math.round(days / 7) > 1 ? 'weeks' : 'week');
    }

}

moment().durationInWeeks(aPastDate,now); // 21 weeks
moment().durationInWeeks(aPastDay,now);  // 6 days