Javascript AngularJS减去(DueDateActual-DueDateForecast)$scope从JSON文件中消耗

Javascript AngularJS减去(DueDateActual-DueDateForecast)$scope从JSON文件中消耗,javascript,json,angularjs,scope,Javascript,Json,Angularjs,Scope,我是AngularJS的新手,需要一些帮助来查找两次约会之间的日期。我从一个JSON文件中使用了两个日期,我想动态地找出每个ID的两个日期之间的天数。下面是我所拥有的,我需要一些帮助 <!doctype html> <html ng-app="MyApp"> <head> <meta charset="utf-8"> <title>Untitled Document</title> <script src="Scrip

我是AngularJS的新手,需要一些帮助来查找两次约会之间的日期。我从一个JSON文件中使用了两个日期,我想动态地找出每个ID的两个日期之间的天数。下面是我所拥有的,我需要一些帮助

<!doctype html>
<html ng-app="MyApp">
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<script src="Scripts/angular.min.js"></script>

</head>

<body >
 <div ng-controller="SiteCtrl">
   <ul ng-repeat="site in sites">
     <li>{{site.ID}}</li>
     <li>{{dayDiff}}</li>
   </ul>
 </div>
 </body>
<script>
var app = angular.module("MyApp", []);

app.controller("SiteCtrl", function($scope, $http) {
  $http.get('JSON/getsamplesitesCopy.json').
    success(function(data, status, headers, config) {


    $scope.sites = data;

    $scope.dayDiff = $scope.sites.DueDateActual - $scope.sites.DueDateForecasted;


}).
   error(function(data, status, headers, config) {
      // log error
   });
});
</script>

</html>
考虑到您的数据:

data = [
  { 
     "ID": "136", 
     "DueDateForecasted": "2015-09-10",      
     "DueDateActual": "2015-09-17"
  },
  { ... }
]
您有一个对象数组,这样:

$scope.sites = data // $scope.sites is also an array
$scope.sites.DueDateActual // undefined
$scope.sites[0].DueDateActual // "2015-09-17"
关于日期的说明。使用字符串格式(如2015-09-17)的日期在与另一个日期相减时不会给出有意义的结果。尝试在浏览器控制台中键入test-test。你猜对了,是楠。为了正确计算日期,需要创建一个新的日期对象,将日期字符串作为参数传递

var dueDateActual = new Date($scope.sites[0].DueDateActual)
dueDateActual // Wed Sep 16 2015 20:00:00 GMT-0400 (EDT)

var dueDateForecasted = new Date($scope.sites[0].DueDateForecasted)
dueDateActual - dueDateForecasted // -604800000
这将返回毫秒,因此需要将其转换为天

为了对数组中的每个元素执行此操作,您可以在流程中添加一个字段来映射数组

$scope.sites = data.map(function (item) {
  var millisDiff = (new Date(item.DueDateActual) - new Date(item.DueDateForecasted))
  item.dayDiff = Math.floor(millisDiff / ( 1000 * 60 * 60 * 24 ))
  return item
})
然后稍微修改ng repeat,将差异包含在重复项上

<ul ng-repeat="site in sites">
  <li>{{site.ID}}</li>
  <li>{{site.dayDiff}}</li>
</ul>

您需要将字符串dates解析为Date对象。您可以为此使用库,或者将其交给非常不推荐的日期构造函数,或者您可以使用以下简单函数:

/*
**  @param  {string} s - Date string yyyy-mm-dd
**  @return {Date}     - Date object for 00:00:00 with system timezone offset
*/
function parseISODate(s) {
  s = s.split(/\D/);
  return new Date(s[0], s[1]-1, s[2]);
}
然后:

$scope.dayDiff = parseISODate($scope.sites.DueDateActual) -
                 parseISODate($scope.sites.DueDateForecasted);
将以毫秒为单位返回两者之间的差值


parse函数将日期视为本地日期,这与ECMA-262 ed 6和ISO 8601一致,但ES5(例如,new Datestring)会将其解析为UTC。

$scope.dayDiff的结果是什么?此外,可能是输入错误,您有$scope.sites//复数和$scope.site//单数,所以现在后者是undefined@azium结果是NaN,这可不好。这里有一个更好的问题,数据的结果是什么?@azium这是一个打字错误。我已经改正了,但是仍然得到了NaN。谢谢你的回答。它确实有效,但它只给我两个对象的第一个对象的结果。我怎样才能得到两者的结果?或多个?请不要建议使用日期构造函数解析字符串,这是不可靠的,上面的将在IE8中返回NaN。总是手动解析字符串。@azium非常感谢您的帮助!它可以工作,但我确实发现了您发布的一个小错误:item.dayDiff=millisDiff*1000*60*60*24,但它应该是:item.dayDiff=millisDiff/1000*60*60*24。对你的帮助我感激不尽。你帮了我一个大忙!这真的帮了我的忙!非常感谢。