Получить дату определенного дня недели в JavaScript
Я думаю, что у меня в основном мозг пердит. Я просто хочу перемотать Date()
до определенного дня недели, а затем получите месяц, день, год для этого.
Например, сегодня 09.03.10, но я хочу функцию (nextSession()
) вернуться 09/08/10 (в следующую среду).
Как бы я это сделал? Лучшее, что я могу придумать, это добавить день к setDate()
до тех пор getDay()
== 3, но это ужасно...
PS JQuery тоже круто.
7 ответов
function nextSession(date) {
var ret = new Date(date||new Date());
ret.setDate(ret.getDate() + (3 - 1 - ret.getDay() + 7) % 7 + 1);
return ret;
}
Этот установит дату следующей среды. Если это уже среда, результат будет через неделю после указанной даты.
РЕДАКТИРОВАТЬ: Добавлена возможность вызова функции без параметра: nextSession()
- возвращает дату следующего сеанса с сегодняшнего дня
Если вам просто нужна среда, вы должны сделать что-то вроде этого:
function next(today) {
var offset = (today.getDay() < 3) ? 0 : 7;
var daysUntilWednesday = 3 + offset - today.getDay();
return new Date().setDate(today.getDate() + daysUntilWednesday);
}
var wed = next( new Date() );
РЕДАКТИРОВАТЬ:
или как то так? http://jsfiddle.net/zy7F8/1/
var days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
function next(day) {
var today = new Date();
var today_day = today.getDay();
day = day.toLowerCase();
for (var i = 7; i--;) {
if (day === days[i]) {
day = (i <= today_day) ? (i + 7) : i;
break;
}
}
var daysUntilNext = day - today_day;
return new Date().setDate(today.getDate() + daysUntilNext);
}
// insert a week day
alert(new Date(next( "Wednesday" )));
РЕДАКТИРОВАТЬ: внесены исправления для введенных дней, которые еще должны прийти на той же неделе.
Вот функция для возврата номера следующего дня.
function nextDay(dayNb){
return function( date ){
return new Date(date.getTime() + ((dayNb-date.getDay() +7) %7 +1) *86400000);
};
}
Чтобы использовать его, установите желаемый номер дня 0: пн - 6: вс
var nextWed = nextDay(2);
alert( nextWed( new Date() ));
Вот и вы: http://jsfiddle.net/ePQuv/
JS (JQuery не требуется):
function addDays(myDate,days) {
return new Date(myDate.getTime() + days*24*60*60*1000);
}
function subtractDays(myDate,days) {
return new Date(myDate.getTime() - days*24*60*60*1000);
}
function dateOfNext(weekdayNumber) {
var today = new Date();
var lastSunday = subtractDays(today, today.getDay());
var daysToAdd = weekdayNumber;
if (weekdayNumber <= today.getDay()) {
daysToAdd = daysToAdd + 7;
}
return addDays(lastSunday, daysToAdd);
}
Для этого нужно вычесть текущий день недели из текущей даты, чтобы добраться до последнего воскресенья. Затем, если сегодняшний день после или равен "следующему дню", который вы ищете, он добавляет 7 дней + день недели, к которому вы хотите добраться, в противном случае он просто добавляет день недели. Это высадит вас на следующий день недели.
Я рекомендую использовать момент.js при работе с датами.
var nextmonday = moment().day(8).format('YYYY-MM-DD'); // e.g. 2015-10-26
var nexttuesday = moment().day(9).format('YYYY-MM-DD'); // e.g. 2015-10-27
var nextwednesday = moment().day(10).format('YYYY-MM-DD'); // e.g. 2015-10-28
var nextthursday = moment().day(11).format('YYYY-MM-DD'); // e.g. 2015-10-29
Вы можете выбрать различные форматы и сделать еще больше приятных вещей, проверьте: http://momentjs.com/
Простой расчет:
//for next sunday, set 0, for saturday 6; wednesday == 3;
var needDay = 3;
var fromDate = new Date(); //or any date you calculate from
fromDate.setDate(fromDate.getDate() + (7 - fromDate.getDay()) + needDay);
console.log(fromDate);
+ (7 - fromDate.getDay ()): добавляет к дате количество дней, чтобы изменить дату на воскресенье.
+ needDay: добавляет день, который вам нужен, если среда, просто +3;