2016-12-29 72 views
0

我正在使用角矩库。出于某种原因,在使用amTimeAgo时,它将超过25天的任何内容视为一个月。amTimeAgo过滤器计算月份错误

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

在Plnkr

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>

同样的例子 - http://plnkr.co/edit/DZqqI5BC2XNrITThLCS7?p=preview

有没有办法,我可以设置所以它计算30天为一个月的配置?或者是这个错误?我正在审阅他们的文档和来源,我似乎无法找到将其更改为30天的地方。

谢谢!

回答

0

您有更大的关注。您会注意到您的代码在这里的代码片段中生成以下警告,并在您的Plunker示例的调试控制台中生成以下警告。

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

无论你是路过作为输入amTimeAgo过滤器将成为一个争论的moment(...)工厂函数。因此,您不应该使用特定于语言环境的格式进行格式设置。

只需移除您daysXXFromNow字段.format('MM/DD/YYYY hh:mm A')并且它将正确呈现的,因为它会通过在一个moment对象,这是完全可以接受的。

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

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

例如,假设你想增加一个月的门槛至28天,你会打电话:

moment.relativeTimeThreshold('d', 28); 

记住的是,“月”一词是比较难以精确的定义第一名(因为每个月都有不同的天数),并且还认为fromNow故意地近似值。

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

+0

非常感谢。我肯定是在看错地方(角度矩),但这是来自moment.js本身的继承设置。使用此过滤器时,我还会记住您的格式化建议。再次感谢。 – devtye