#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()));