Как получить неделю мудрая дата начала и окончания в angularjs
прежде чем я использую angularjs-DatePicker из этого НПМ.
здесь я могу выбрать дату из календаря.Но теперь я должен поля как FromDate и ToDate что означает неделю параметр StartDate и EndDate должно отображаться, когда любая дата выбирает на этой неделе.
Ex: как в календаре 01-08-2017 начать с Вт, поэтому всякий раз, когда выбирает любую дату от 01 до 05, то два поля должны отображаться как FromDate как 01 и TODate как 06 и в то же время, когда пользователь выбирает 31-07-2017 два поля должны отображаться как 30 и 31 июля.
У меня есть идея достичь ToDate из Fromdate Calender control onChange event в DotNet, как показано ниже code
Convert.ToDouble(objstart.DayOfWeek)).ToString("dd-MM-yyyy")
но как достичь этого usecase в angularjs.
спасибо
5 ответов
Ok, поэтому я бы сделал, чтобы рассчитать разные даты и взять min/max в зависимости от начала или конца недели.
здесь:
//Use the date received, UTC to prevent timezone making dates shift
var pickedDate = new Date("08-03-2017UTC");
var startSunday = new Date(pickedDate);
startSunday.setDate(pickedDate.getDate() - pickedDate.getDay());
var startMonth = new Date(pickedDate);
startMonth.setDate(1);
var startDate = Math.max(startMonth,startSunday);
console.log("Start:" , new Date(startDate));
var endSaturday = new Date(pickedDate);
endSaturday.setDate(pickedDate.getDate() + (7-pickedDate.getDay()));
var endMonth = new Date(pickedDate);
endMonth.setMonth(pickedDate.getMonth()+1);//Add a month
endMonth.setDate(0);// to select last day of previous month.
var endDate = Math.min(endMonth,endSaturday);
console.log("End" , new Date(endDate));
трюк состоял в том, чтобы играть с датами, найти все возможные даты начала и конца, а затем выбрать правильный с математикой.min и Math.max, который будет сравнивать даты, используя их метку времени.
в JavaScript есть очень хорошая библиотека для обработки манипуляций с датами.
https://github.com/datejs/Datejs
есть метод
Date.parse('next friday') // Returns the date of the next Friday.
Date.parse('last monday')
используя этот метод, вы можете получить дату начала и окончания недели на основе текущей недели.
Я надеюсь, что это поможет.
вы можете просто достичь этого, используя библиотеку момент. В этой библиотеке много полезных функций.
var selectedDate = moment('Mon Aug 10 2017');
//If you want to get the ISO week format(Monday to Sunday)
var weekStart = selectedDate.clone().startOf('isoweek').format('MMM Do');
var weekEnd = selectedDate.clone().endOf('isoweek').format('MMM Do');
//If you want to get the Sunday to Saturday week format
var weekStart = selectedDate.clone().startOf('week').format('MMM Do');
var weekEnd = selectedDate.clone().endOf('week').format('MMM Do');
здесь не нужна угловая директива, вы можете использовать расширение JavaScript, которое приведено ниже.
//get week from date
Date.prototype.getWeekNumber = function (weekstart) {
var target = new Date(this.valueOf());
// Set default for weekstart and clamp to useful range
if (weekstart === undefined) weekstart = 1;
weekstart %= 7;
// Replaced offset of (6) with (7 - weekstart)
var dayNr = (this.getDay() + 7 - weekstart) % 7;
target.setDate(target.getDate() - dayNr + 0);//0 means friday
var firstDay = target.valueOf();
target.setMonth(0, 1);
if (target.getDay() !== 4) {
target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
}
return 1 + Math.ceil((firstDay - target) / 604800000);;
};
//get date rance of week
Date.prototype.getDateRangeOfWeek = function (weekNo, weekstart) {
var d1 = this;
var firstDayOfWeek = eval(d1.getDay() - weekstart);
d1.setDate(d1.getDate() - firstDayOfWeek);
var weekNoToday = d1.getWeekNumber(weekstart);
var weeksInTheFuture = eval(weekNo - weekNoToday);
var date1 = angular.copy(d1);
date1.setDate(date1.getDate() + eval(7 * weeksInTheFuture));
if (d1.getFullYear() === date1.getFullYear()) {
d1.setDate(d1.getDate() + eval(7 * weeksInTheFuture));
}
var rangeIsFrom = eval(d1.getMonth() + 1) + "/" + d1.getDate() + "/" + d1.getFullYear();
d1.setDate(d1.getDate() + 6);
var rangeIsTo = eval(d1.getMonth() + 1) + "/" + d1.getDate() + "/" + d1.getFullYear();
return { startDate: rangeIsFrom, endDate: rangeIsTo }
};
ваш код может выглядеть так
var startdate = '01-08-2017'
var weekList = [];
var year = startdate.getFullYear();
var onejan = new Date(year, 0, 1);//first january is the first week of the year
var weekstart = onejan.getDay();
weekNumber = startdate.getWeekNumber(weekstart);
//generate week number
var wkNumber = weekNumber;
var weekDateRange = onejan.getDateRangeOfWeek(wkNumber, weekstart);
var wk = {
value: wkNumber
, text: 'Week' + wkNumber.toString()
, weekStartDate: new Date(weekDateRange.startDate)
, weekEndDate: new Date(weekDateRange.endDate)
};
weekList.push(wk);
Я думаю, что для этого нет директивы или фильтра, вам нужно создать его для себя. вы можете ссылаться на объект date из дата-время-объект