2010-09-03 5 views
19

Creo que estoy teniendo un pedo cerebral principalmente. Solo quiero adelantar un Date() hasta un día específico de la semana y luego obtener el Mes, Día, Año para eso.Obtener la fecha del día específico de la semana en JavaScript

E.g. hoy es 09/03/10 pero quiero que una función (nextSession()) regrese el 08/09/10 (el próximo miércoles).

¿Cómo voy a hacer esto? Lo mejor que se me ocurre es agregar un día al setDate() hasta getDay() == 3, pero es feo ...

P.S. jQuery también es genial.

Respuesta

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

Esta establecerá la fecha para el próximo miércoles. Si ya es miércoles, el resultado será una semana después de la fecha especificada.

EDIT: posibilidad de llamar a la función sin un parámetro Añadido: nextSession() - vuelve próxima fecha de la sesión de hoy

+0

Se ha modificado a: function xnextSession() { \t var ret = new Date(); \t ret.setDate (ret.getDate() + (3 - 1 - ret.getDay() + 7)% 7 + 1); \t return ret; \t} Eso seguirá funcionando, ¿verdad? Quiero decir ... parece que ... –

+0

Veo que ha cambiado 'var ret = new Date();' Debe ser 'new Date (date)', porque setDate() establecerá solo el día del mes , y otra información como mes o año se ha ido. La razón por la que declaro la variable ret es porque no quiero cambiar el valor 'date'. 'var ret = new Date (date)' hace una copia del objeto 'date', no copia de la referencia. EDITAR: Lo siento, por supuesto, funcionará para el día actual, no vi todo ^^ ' – pepkin88

+0

Maldita sea, esto está limpio. Mi única sugerencia sería hacer que el día en que avance a un parámetro. +1 – Ender

8

Use the DateJS library.

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

no hay nada que codificar para nosotros los programadores o qué? +1 – Anurag

+0

@Anurag en serio! –

+0

@Adam gracias, parece perfecto, pero voy a esperar para ver si alguien me da una forma más ligera de hacerlo. 25k + jQuery + jQuery UI + mi archivo personal de 40kb JS para esta aplicación es bastante pesado jaja Pero, esta es una muy buena lib –

5

Si sólo necesita Miércoles, usted debería ser capaz de hacer algo como esto:

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:

o algo así? 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: ha hecho una corrección para los días introducidos que están por venir en la misma semana.

+1

¿Puede alguien dar una razón * inteligente * para el voto abajo? – user113716

2

Aquí van: http://jsfiddle.net/ePQuv/

Los js (sin jQuery es necesario) es:

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

Lo que hace es restar el día actual de la semana de la fecha actual, para llegar al último domingo. Entonces, si hoy es igual o posterior al "día siguiente" que está buscando, agrega 7 días + el día de la semana al que desea llegar, de lo contrario solo agrega el día de la semana. Esto te llevará al siguiente día de la semana.

2

Aquí está una función para devolver el número del día siguiente.

function nextDay(dayNb){ 
return function(date){ 
    return new Date(date.getTime() + ((dayNb-date.getDay() +7) %7 +1) *86400000); 
}; 
} 

Para usarlo, establezca el número del día que desea 0: Lun - 6: Sun

var nextWed = nextDay(2); 
    alert(nextWed(new Date())); 
1

recomiendo usar moment.js si se trabaja con fechas.

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 

Usted puede escoger diversos formatos y hacer cosas aún más agradable, echa un vistazo a: http://momentjs.com/

0

simple cálculo:

//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()): agrega a Fecha cantidad de días para cambiar la fecha a sunda y
+ needDay: agrega el día que necesita, si es miércoles, solo +3;

Cuestiones relacionadas