【问题标题】:How to get duration in weeks with Moment.js?如何使用 Moment.js 以周为单位获得持续时间?
【发布时间】:2012-07-12 09:00:49
【问题描述】:

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

moment(d).subtract("days", 3).from(d) // 返回“3天前”

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

moment(d).subtract("weeks", 2).from(d) // 返回 "14 天前" i/o "2 周前"

如何使用moment.js 获得“2 周前”?

【问题讨论】:

    标签: javascript momentjs


    【解决方案1】:

    改进@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
    

    【讨论】:

      【解决方案2】:

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

      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.
      

      【讨论】:

        【解决方案3】:

        使用新的updateLocale()。

        Moment.js 再次更新,the preferred method 如下:

        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'
          }
        
        });
        

        感谢@timrwood 和@gahen 的回答。

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

        GitHub 问题是here,所以如果您想这样做,请点赞:

        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');
                  }
                }
          }
        
        });
        

        【讨论】:

          【解决方案4】:

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

          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"); 
              }
          }
          

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              【解决方案6】:

              分享并希望仍然有用:

              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"
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-03-10
                • 1970-01-01
                • 1970-01-01
                • 2012-10-27
                • 1970-01-01
                • 2022-10-15
                • 2013-10-13
                相关资源
                最近更新 更多