我是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>
答案 0 :(得分:3)
考虑您的数据:
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"
。你猜对了,它是NaN
。为了正确地使用日期进行数学运算,您需要创建一个new Date
对象,并将日期字符串作为参数传递。
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
这将返回毫秒,因此您需要将其转换为天数
为了对数组中的每个元素执行此操作,您可以map
在过程中添加字段的数组。
$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>
答案 1 :(得分:1)
您需要将字符串日期解析为Date对象。你可以使用一个库,或者将它提供给Date构造函数(非常不推荐),或者你可以使用一个简单的函数:
String s = in.next();
然后:
/*
** @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]);
}
将返回两者之间的毫秒差异。
解析函数将日期视为本地日期,这与ECMA-262 ed 6和ISO 8601一致,但ES5(例如新日期(字符串))将其解析为UTC。