У меня есть следующий код controller
:
$scope.a="26-04-2016";
$scope.c = moment($scope.a,"DD-MM-YYYY").format("DD-MM-YYYY");
$scope.b="20-10-2016";
$scope.d = moment($scope.b,"DD-MM-YYYY").format("DD-MM-YYYY");
if($scope.d <= $scope.c){
alert($scope.d+' es menor a '+$scope.c)
}else{
alert($scope.d+' es mayor a '+$scope.c)
}
При этом я сравниваю две даты между 20-10-2016
и 26-04-2016
, на первый взгляд известно, что 20-10-2016
больше, чем, 26-04-2016
но при выполнении этого кода он дает мне результат, что он меньше.
В чем проблема?
Проблема в следующем:
Это избыточно, и это также причина того, что вы сравниваете даты как строки, а не как
Date
объекты javascript, и когда вы сравниваете строки, они дадут вам более или менее в соответствии с алгоритмом сравнения, который выполняет разные шаги (шаг 4), как если бы оба операнда алгоритма были даты (шаг 3).Таким образом, возможные решения могут быть
Не избавляйтесь от
moment
исходного объекта и используйте его для сравнения с использованием методов (рекомендуется)isSame
(===
)isBefore
(<
)isAfter
(>
)isSameOrBefore
(<=
)isSameOrAfter
(>=
)Вот пример
moment
иDate
сравните, используя соответствующие методыНаконец, я рекомендую вам манипулировать датами, используя формат ISO 8601 . Это не обязательно, но это стандарт, и он избавит вас от необходимости выполнять множество преобразований формата даты в ваших программах.
Вы также можете сравнить их как JSON, т.е.:
Буквально вчера я попробовал это с AngularJS (Angular 1), и это сработало :)
.format() преобразует дату (объект момента) в текстовую строку. Если вы используете стандартный формат, сортировка по году, месяцу, дню не будет проблемой. Но вы указываете, что формат вывода — день, месяц, год, поэтому при сравнении текстовых строк они будут рассматриваться как числа, а не как даты, поэтому 26042016 больше, чем 20102016.
Решение состоит в том, чтобы сравнить объекты моментов напрямую или с помощью функций сравнения моментов: isBefore() и isAfter(). Затем формат задается во время отображения переменной.
Я не могу проверить это, но я думаю, что это сработает для вас