Лучшее решение, которое сработало для меня, это:
private static int findDaysDiff(long unixStartTime,long unixEndTime)
{
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(unixStartTime);
calendar1.set(Calendar.HOUR_OF_DAY, 0);
calendar1.set(Calendar.MINUTE, 0);
calendar1.set(Calendar.SECOND, 0);
calendar1.set(Calendar.MILLISECOND, 0);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(unixEndTime);
calendar2.set(Calendar.HOUR_OF_DAY, 0);
calendar2.set(Calendar.MINUTE, 0);
calendar2.set(Calendar.SECOND, 0);
calendar2.set(Calendar.MILLISECOND, 0);
return (int) ((calendar2.getTimeInMillis()-calendar1.getTimeInMillis())/(24 * 60 * 60 * 1000));
}
Поскольку он сначала преобразует Hour
, Minute
, Second
и Millisecond
в 0
, и теперь разница будет быть только в днях.
С вашим блоком checkboxes сложно работать. Так что это просто требует перестановки. Начните с 2D-массива флажков и заполните все значения false
. Затем пройдите через известные флажки и найдите их индекс для строк и столбцов, а затем просто покажите его с помощью ng-model="checkboxes[$parent.$index][$index]"
.
Вот моя версия в качестве демонстрации:
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
var n = $scope.names = [
{name_id:10, name:"Micheal"},
{name_id:20, name:"James"},
{name_id:30, name:"Peter"},
{name_id:40, name:"Eddy"}
];
var c = $scope.cols = [
{col_id:1},
{col_id:2},
{col_id:3},
{col_id:4},
{col_id:5}
];
var checked_boxes = [
{name_id:10, col_id:2},
{name_id:20, col_id:1},
{name_id:30, col_id:4}
];
$scope.checkboxes = n.map( function(x) {
return c.map( function(y) {
return false;
});
})
for(var i=0; i<checked_boxes.length; i++){
var ni = n.map(function(_) { return _.name_id; }).indexOf(checked_boxes[i].name_id); // match the index of `name_id`
var ci = checked_boxes[i].col_id-1; // or like above -> c.map(...).indexOf(...) // but for `col_id`
$scope.checkboxes[ni][ci] = true;
}
});
<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<body>
<div ng-app="myApp" ng-controller="myCtrl">
<table>
<tr ng-repeat="item in names track by $index">
<td>{{item.name}}</td>
<td ng-repeat="col in cols">
<input type="checkbox" value="" class="form-control" ng-model="checkboxes[$parent.$index][$index]" />
</td>
</tr>
</table>
</div>
</body>
</html>
Я сделал вам небольшой пример, чтобы вы могли сделать это проще. Мое предложение следующее:
ng-model
в ваших флажках вы можете изменить на ng-click
, чтобы установить значение в вашем массиве данных, что упростит, если вы хотите собрать это информацию позже. <div ng-app="questions">
<div ng-controller="QuestionController as ctrl">
<table>
<thead>
<tr>
<th>Name</th>
<th>A</th>
<th>B</th>
<th>C</th>
<th>D</th>
<th>E</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in ctrl.questions track by $index">
<td id="{{item.name_id}}">{{item.name}}</td>
<td ng-repeat="col in ctrl.cols">
<input type="checkbox" class="form-control" ng-click="ctrl.selectOption(item, col)"/>
</td>
</tr>
</tbody>
</table>
<button ng-click="ctrl.load()">
Load button data
</button>
</div>
</div>
angular.module('questions', []);
angular.module('questions').controller('QuestionController', QuestionController);
function QuestionController () {
var ctrl = this;
ctrl.questions = [{
name: 'Name 1',
name_id: 'Name_1',
selectedOption: ''
},{
name: 'Name 2',
name_id: 'Name_2',
selectedOption: ''
},{
name: 'Name 3',
name_id: 'Name_3',
selectedOption: ''
}];
ctrl.cols = ['A', 'B', 'C', 'D', 'E'];
ctrl.selectOption = function (entry, selectedOption) {
entry.selectedOption = selectedOption;
};
ctrl.load = function () {
angular.forEach(ctrl.questions, function (question) {
console.log('Name: ' + question.name + ' - Answer: ' + question.selectedOption);
});
}
}