amTimeAgo Filter 计算月数错误

amTimeAgo Filter Calculate months wrong

我正在使用 angular-moment 库。出于某种原因,当使用 amTimeAgo 时,它会将超过 25 天的所有内容视为一个月。

在这个例子中,我使用 moment JS 从当前时间开始倒计时 25、26、27 天。然后使用 amTimeAgo 计算从现在开始的持续时间。

angular.module('timeApp', ['angularMoment'])
.controller('mainController', [ '$scope', function($scope) {
  
   $scope.today = new Date();
   $scope.parsedToday = moment($scope.today).format('MM/DD/YYYY hh:mm A');
   $scope.days25FromNow = moment($scope.today).subtract({days: 25}).format('MM/DD/YYYY hh:mm A');
   $scope.days26FromNow = moment($scope.today).subtract({days: 26}).format('MM/DD/YYYY hh:mm A');
   $scope.days27FromNow = moment($scope.today).subtract({days: 27}).format('MM/DD/YYYY hh:mm A');
  
}]);
<!DOCTYPE html>
<html>

  <head>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.16.0/moment.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-moment/1.0.0/angular-moment.min.js"></script>

    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>
  
  <body>
    <div class="container" ng-app="timeApp" ng-controller="mainController as main">

      <div>
        <h2>AmTimeAgo Error in Over 25 days</h2>
        <h3>The Time is {{ parsedToday}}</h3>
        
        <p>25 Days From Now - {{days25FromNow}} <br>
          Original AM Time Ago -  {{days25FromNow | amTimeAgo}} <br>
          Expect - 25 days ago
        </p>

        <p>26 Days From Now - {{days26FromNow}} <br>
          Original AM Time Ago -  {{days26FromNow | amTimeAgo}}<br>
          Expect - 26 days ago
        </p>
        
        <p>27 Days From Now - {{days27FromNow}} <br>
          Original AM Time Ago -  {{days27FromNow | amTimeAgo}}<br>
          Expect - 27 days ago
        </p>        
      </div>
      
      
    </div>
  </body>

</html>

Plnkr 中的相同示例 - http://plnkr.co/edit/DZqqI5BC2XNrITThLCS7?p=preview

是否有我可以设置的配置,以便将一个月计算为 30 天?或者是这个错误?我正在查看他们的文档和源代码,我似乎找不到在哪里将其更改为 30 天。

谢谢!

你有一个更大的顾虑。您会注意到您的代码在此处的代码段以及您的 Plunker 示例的调试控制台中生成了以下警告。

Deprecation warning: value provided is not in a recognized ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.

无论您将什么作为输入传递给 amTimeAgo 过滤器,都将成为 moment(...) 工厂函数的参数。因此,您不应使用特定于语言环境的格式对其进行格式化。

只需从 daysXXFromNow 字段中删除 .format('MM/DD/YYYY hh:mm A') 即可正确呈现,因为它会传入一个 moment 对象,这是完全可以接受的。

要回答您提出的问题,您会看到正确的行为,因为需要考虑相对阈值。默认情况下,26 到 45 天的时间段被视为一个月。 This is described here.

您可以根据需要自定义这些设置,方法是设置相对时间阈值,as described here

例如,假设您想将 1 个月的阈值增加到 28 天,您可以调用:

moment.relativeTimeThreshold('d', 28);

请记住,术语 "months" 首先相对难以精确定义(因为每个月的天数不同),而且 fromNow有意近似。

如果您只是想要准确的天数,则可以使用 diff 函数而不是 fromNow 函数。