Как получить неделю мудрая дата начала и окончания в 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 из дата-время-объект