Получить начало и конец недели с началом в понедельник и окончанием в воскресенье в Javascript

#javascript #date

#javascript #Дата

Вопрос:

     function getStartAndEndOfWeek(date) {

        var curr = date ? new Date(date) : new Date();
        var first = curr.getDate() - curr.getDay(); 

        var firstday = new Date(curr.setDate(first));
        var lastday = new Date(curr.setDate(firstday.getDate()   6));

        return [firstday, lastday];

    }
  

Я не могу установить начало недели как понедельник. Приведенный выше код дает первый день как воскресенье. Также, если мы вообще добавим первый плюс один, это даст понедельник в качестве начала, но проблема будет в том, где, скажем, (29.06.2014, воскресенье) является вводом, он должен возвращать (23.06.2014 как начало и 29.06.2014) в качестве конца. Как мы можем это сделать? Если я добавлю «первый 1», он вернет 30.06.2014 в качестве начальной и 06.07.2014 в качестве конечной даты. Любая помощь? Спасибо.

Ответ:

     function getStartAndEndOfWeek(date) {

        //Calculating the starting point

        var curr = date ? new Date(date) : new Date();
        var first = curr.getDate() - dayOfWeek(curr);

        var firstday, lastday;

        if (first < 1) {
            //Get prev month and year
            var k = new Date(curr.valueOf());
            k.setDate(1);
            k.setMonth(k.getMonth() - 1);
            var prevMonthDays = new Date(k.getFullYear(), (k.getMonth()   1), 0).getDate();

            first = prevMonthDays - (dayOfWeek(curr) - curr.getDate());
            firstday = new Date(k.setDate(first));
            lastday = new Date(k.setDate(first   6));
        } else {
            // First day is the day of the month - the day of the week
            firstday = new Date(curr.setDate(first));
            lastday = new Date(curr.setDate(first   6));
        }

        return [firstday, lastday];            
    }

    function dayOfWeek(date, firstDay) {
        var daysOfWeek = {
            sunday: 0,
            monday: 1,
            tuesday: 2,
            wednesday: 3,
            thursday: 4,
            friday: 5,
            saturday: 6,
        };
        firstDay = firstDay || "monday";
        var day = date.getDay() - daysOfWeek[firstDay];
        return (day < 0 ? day   7 : day);
    }
  

Ответ №1:

Вы можете установить сначала понедельник, сдвинув результат getDay() , а затем умножив результат по модулю.

 var first = curr.getDate() - ((curr.getDay()   6) % 7); 
  

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

1. Но это возвращает 6 в воскресенье.

2. Да, и понедельник будет равен 0, как и было запрошено.

Ответ №2:

Как насчет создания простого метода, который позволит вам легко манипулировать первым днем недели:

 (function() {
  var original = Date.prototype.getDay;
  var daysOfWeek = {
    sunday: 0,
    monday: 1,
    tuesday: 2,
    wednesday: 3,
    thursday: 4,
    friday: 5,
    saturday: 6,
  };

  Date.prototype.getDay = function(weekBegins) {
    weekBegins = (weekBegins || "sunday").toLowerCase();
    return (original.apply(this)   7 - daysOfWeek[weekBegins]) % 7;
  };
})();
  

Затем вы можете просто использовать:

 var first = curr.getDate() - curr.getDay("monday"),
    last  = first   6;
  

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

1. Также проблема в том, что если я отправляю воскресенье в качестве даты в функцию, она возвращает следующую неделю, а не предыдущую неделю. Вот почему я его не добавил.

2. Обновлено, это помогает?

3. Я понимаю проблему с переключением месяцев. Существует основная проблема, когда, допустим, сегодня (29.06.2014, воскресенье) является вводом, он должен возвращать (23.06.2014 как начало и 29.06.2014) в качестве конца. Как мы можем это сделать? Теперь, согласно тому, что вы сказали, он возвращает 30.06.2014 в качестве начальной и 06.07.2014 в качестве конечной даты

Ответ №3:

намного проще

 var numberdayweek = [6,0,1,2,3,4,5];
fecha = new Date();
console.log(numberdayweek[fecha.getDay()]);  

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

1. Может быть упрощено до [6,0,1,2,3,4,5][fecha.getDay()] или даже [6,0,1,2,3,4,5][new Date().getDay()]

Ответ №4:

Найдено другое решение:

 const getDayIndexMondaySunday = (date) =>date.getDay() === 0 ? 6 : date.getDay() - 1
 // Result on Today
 console.log(getDayIndexMondaySunday(new Date()));