amTimeAgo过滤器计算错误的月份

时间:2016-12-29 00:41:46

标签: javascript angularjs angular-moment

我正在使用角度矩库。出于某种原因,当使用amTimeAgo时,它会将超过25天的任何事情视为一个月。

在这个例子中,我使用片刻JS来计算当前时间25,26,27天。然后使用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>
&#13;
{{1}}
&#13;
&#13;
&#13;

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

是否有我可以设置的配置,因此它计算为每月30天?或者是这个错误?我正在查看他们的文档和来源,我似乎无法找到将此更改为30天的位置。

谢谢!

1 个答案:

答案 0 :(得分:0)

你有更大的担忧。您会注意到您的代码在此处的代码段和Plunker示例的调试控制台中生成以下警告。

  

弃用警告:提供的值不是公认的ISO格式。时刻构造回落到js Date(),这在所有浏览器和版本中都不可靠。不鼓励使用非ISO日期格式,并将在即将发布的主要版本中删除。有关详细信息,请参阅http://momentjs.com/guides/#/warnings/js-date/

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

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

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

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

例如,假设您想将一个月的阈值提高到28天,您可以致电:

moment.relativeTimeThreshold('d', 28);

请记住,术语“月”相对难以首先精确定义(因为每个月都有不同的天数),并且fromNow 故意< / em>近似。

如果您只想要确切的天数,则可以使用diff函数代替fromNow函数。