2010-09-03 26 views
19

Я думаю, что у меня в основном есть мозговой пердит. Я просто хочу переслать Date() до определенного дня недели, а затем получить месяц, день, год.Получить дату определенного дня недели в JavaScript

E.g. сегодня 09/03/10, но я хочу функцию (nextSession()), чтобы вернуться 09/08/10 (следующая среда).

Как мне это сделать? Самое лучшее, что я могу придумать, это добавить день до setDate() до getDay() == 3, но это сорт уродливый ...

P.S. jQuery тоже классный.

ответ

29
function nextSession(date) { 
    var ret = new Date(date||new Date()); 
    ret.setDate(ret.getDate() + (3 - 1 - ret.getDay() + 7) % 7 + 1); 
    return ret; 
} 

Этот день будет установлен в следующую среду. Если это уже среда, результат будет на одну неделю позже указанной даты.

EDIT: Добавлена ​​возможность вызова функции без параметров: nextSession() - он возвращает следующую дату сеанса с сегодняшнего дня

+0

Изменено: к функции xnextSession() { \t var ret = new Date(); \t ret.setDate (ret.getDate() + (3 - 1 - ret.getDay() + 7)% 7 + 1); \t return ret; \t} Это все еще работает правильно? Я имею в виду ... похоже, это было бы ... –

+0

Я вижу, что вы изменили 'var ret = new Date();' Это должно быть 'new Date (date)', потому что setDate() будет устанавливать только день месяца , и другая информация, например, месяц или год, исчезла. Причина, по которой я объявляю переменную ret, заключается в том, что я не хочу менять значение 'date'. 'var ret = new Date (date)' делает копию объекта 'date', а не копией ссылки. EDIT: Извините, конечно, он будет работать на текущий день, я не видел всего. ^^ ' – pepkin88

+0

Черт, это чисто. Мое единственное предложение - сделать день, когда вы продвигаетесь к параметру. +1 – Ender

8

Использование the DateJS library.

Date.parse('next wednesday'); 
+19

ничего не осталось для программирования для нас программистов или что? +1 – Anurag

+0

@ Анураг всерьез! –

+0

@ Адам спасибо, отлично выглядит, но я собираюсь подождать, чтобы увидеть, дает ли кто-нибудь мне более легкий способ сделать это. 25k + jQuery + jQuery UI + мой персональный 40-килобайтный JS-файл для этого приложения довольно тяжелый ха-ха. Но это очень классный lib –

5

Если вам просто нужно в среду, вы должны быть в состоянии сделать что-то вроде этого:

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

EDIT:

или что-то вроде этого? 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")));​​​​​​​​​ 

EDIT: Сделано исправление для дней введенными, которые еще приходят в течение одной недели.

+1

Может кто-нибудь дать разумную причину проголосовать? – user113716

2

Здесь вы идете: http://jsfiddle.net/ePQuv/

The 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 дней + день недели, к которому вы хотите добраться, иначе он просто добавит день недели. Это высадит вас в следующий день в любой день недели.

2

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

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

Я рекомендую использовать moment.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/

0

простой расчет:

//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()): добавляет к Дате количество дней, чтобы изменить дату на sunda у.
+ needDay: добавляет ваш день вам нужно, если среда, только +3;

Смежные вопросы