0

angular-moment ライブラリを使用しています。どういうわけか を使用すると、25日を超えるものはすべて月として扱われamTimeAgoます。

この例では、モーメント 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

1 か月あたり 30 日と計算されるように設定できる構成はありますか? それともこのバグですか?私は彼らのドキュメントとソースを調べていますが、これを 30 日に変更する場所が見つからないようです。

ありがとう!

4

1 に答える 1

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 日が 1 か月と見なされます。 これについては、こちらで説明しています

こちら で説明されているように、相対時間のしきい値を設定することで、必要に応じてこれらの設定をカスタマイズできます。

たとえば、1 か月のしきい値を 28 日に増やしたい場合は、次のように呼び出します。

moment.relativeTimeThreshold('d', 28);

そもそも「月」という用語を正確に定義するのは比較的難しく (月ごとに日数が異なるため)、意図的に概算fromNowであることに注意してください。

代わりに正確な日数が必要な場合は、diff関数の代わりに関数を使用しfromNowます。

于 2016-12-29T01:33:28.157 に答える