Сравнение дат JavaScript оценивается неправильно

#javascript

#JavaScript

Вопрос:

Это выражение оценивается как true. Почему?

 if ($scope.state.dateStart < $scope.state.previousStart || $scope.state.dateEnd > $scope.state.previousEnd) {
  

При отладке я вижу, что значения одинаковы, поэтому выражение не должно быть истинным:

введите описание изображения здесь

Редактировать: в какой-то момент предыдущие значения устанавливаются следующим образом:

 $scope.state.previousStart = new Date($scope.state.dateStart);
$scope.state.previousEnd = new Date($scope.state.dateEnd);
  

Редактировать: это фабрика angular, показывающая, как изначально определены значения.

 app.factory('historyRepository', ['$http', '$rootScope', function ($http, $rootScope) {
    var state = {
        allBatches: [],
        filteredBatches: [],
        selectedBatch: null,
        allStatuses: [],
        dateStart: new Date(),
        dateEnd: new Date(),
        previousStart: new Date(),
        previousEnd: new Date()
    }

    // Set initial start and end date times
    var date = new Date();
    date.setDate(date.getDate() - 7); // 7 days ago
    state.dateStart = new Date(date);
    state.previousStart = new Date(date);
    state.dateEnd.setHours(23, 59, 59, 999); // Use ending of end date. (hour,min,sec,millisec)
    state.previousEnd.setHours(23, 59, 59, 999); // Use ending of end date. (hour,min,sec,millisec)

    return state;
}]);
  

Комментарии:

1. Не вставляйте изображение, а только текст, спасибо

2. dateStart определяется первым, поскольку вы ничего не передавали конструктору (из `date), он использует текущее время, поэтому он старше.

3. где dateEnd и previousEnd определены?

4. Жиль: Я не могу показать значения отладки без вставки изображения. Памблам: это было бы верно, если бы я использовал эти начальные значения, но они были изменены позже. На скриншоте вы можете видеть, что у них одинаковое время.

5. @charlietfl Я отредактировал свой пост, чтобы показать это.

Ответ №1:

Проблема была в моих конечных датах; в частности, в миллисекундах. При установке даты с использованием существующей даты миллисекунды не задаются. Необходимо установить миллисекунды, чтобы даты были равны.

 $scope.state.previousEnd = new Date($scope.state.dateEnd);
$scope.state.previousEnd.setMilliseconds(999);
// Now previousEnd and dateEnd are the same.
  

Я смог увидеть, что даты не совпадали, делая это:

 // Show milliseconds since January 1, 1970
console.log('dateEnd', $scope.state.dateEnd.getTime());
console.log('previousEnd', $scope.state.previousEnd.getTime());
  

И вот результат:

     dateEnd 1476331199999
previousEnd 1476331199000