Chciałbym ograniczyć Datepicker Angular UI do dwóch dat przekazanych jako zmienne. Najlepiej byłoby, gdyby działał bez dodawania biblioteki typu instantjs, ponieważ jest to jedyne pole, w którym muszę pracować z datami.AngularUI Datepicker wyłącz daty poza zakresem
Oto plunker tego problemu:
http://plnkr.co/edit/zsjpoVZtHqJLIP2RW6vm?p=preview
tutaj są zmienne:
mycurrentdate = '2016-04-18'
mymindate = '2016-04-01'
mymaxmonth = '2016-05-01'
mymaxdate will be calculated from mymaxmonth to be
mymaxdate = '2016-05-31'
Moja rzeczywista data max będzie ostatnim dniem mymaxmonth
$scope.maxDate = new Date(
$scope.mymaxmonth + (TO THE END OF THE MONTH)
);
Jedną z rzeczy do zapamiętania jest to, że działa to przez new Date()
zwraca datę, która jest na dzień przed podaną datą. Na przykład:
$scope.minDate = new Date(
$scope.mymindate
);
$ scope.minDate powraca Wed Mar 30 2016 17:00:00 GMT-0700 (PDT)
Spojrzałem w górę powód dlaczego zwraca Marzec 30 zamiast 1 kwietnia i wydaje się błędem strefy czasowej?
Chcę ustawić mymindate z "2016-04-01" i uzyskać mymaxdate = "2016-05-31" i wyłączyć wszystkie daty poza tym zakresem. Przeczytałem Beginners Guide to Javascript Date and Time i wypróbowałem to tutaj.
W regulatorze mam:
$scope.mymindate = '2016-04-01';
$scope.mymaxmonth = '2016-05-01'; //want mymaxdate to be '2016-05-31'
$scope.minDate = new Date($scope.dt.getFullYear(), $scope.dt.getMonth(), 1);
$scope.maxDate = new Date($scope.dt.getFullYear(), $scope.dt.getMonth() + 1, 0);
W szablonie mam:
<p class="input-group">
<input type="text" class="form-control" uib-datepicker-popup="{{format}}" ng-model="dt" is-open="popup1.opened" min-date="minDate" max-date="maxDate" datepicker-options="dateOptions" ng-required="true" close-text="Close" alt-input-formats="altInputFormats" />
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="open1()"><i class="glyphicon glyphicon-calendar"></i></button>
</span>
</p>
"* ... wydaje się być błędem strefy czasowej *". Nie błąd, kiepska decyzja projektowa autorów ECMA-262, patrz [* Dlaczego nowa data() usuwa dzień? *] (Http://stackoverflow.com/questions/36698286/why-is-new- data-usuwanie-a-day-javascript). Jedynym sposobem na uniknięcie niewłaściwego parsowania konstruktora * Date * (i * Date.parse *, są one równoważne) jest ręczne przeanalizowanie daty. Więc zapisz funkcję (2 linie kodu) lub użyj biblioteki. W GitHubie jest wiele małych parsujących i formatujących bibliotek lub idź na moment.js, jeśli masz inne rzeczy do zrobienia. – RobG
Pamiętaj, że jeśli masz datę 31 maja 2016 r. I dodasz jeden miesiąc, dostaniesz 01-lipiec-2016 r. (Ponieważ nie ma 31 czerwca, przetacza się ona do lipca). Arytmetyka dat nie jest trywialna i dlaczego większość używa małej (lub może dużej) biblioteki do takich rzeczy. – RobG
@RobG Jest to jedyny czas w mojej aplikacji będę używać dat, więc wolałbym trzymać się z dala od dodawania zależności biblioteki, jeśli to możliwe. – jenryb