Fechas y selects

Hace un mes o así te pregunté una cosa de unas tablas, no sé si te acuerdas... Bueno, aquéllo lo conseguí más o menos :))
Ahora tengo otro problema, espero que puedas ayudarme. Verás, tengo el siguiente código:
<html>
<head>
<script type="text/javascript">
hoy=new Date();
num=((hoy.getDate()<10) ? "0" : "")+hoy.getDate();
mes=hoy.getMonth();
meses=['enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'];
diasxMes=[31,28,31,30,31,30,31,31,30,31,30,31];
Mes=meses[mes];
function setmes(){
for (var i=0;i<12;i++){
opt = new Option();
opt.value = meses ;
opt.text = meses;
if (mes==i) {opt.selected=true;}
document.getElementById('elmes').options = opt;
}
}
function setDias(){
for (var i=1;i<=diasxMes[mes];i++){
opt = new Option();
opt.value = i;
opt.text = i;
if (hoy.getDate()==i) {opt.selected=true;}
document.getElementById('dias').options[i-1] = opt;
}
}
function setSelects(){
setmes();
setDias();
}
</script>
</head>
<body onload="setSelects();">
<form name="frm">
dia ida:<select name="dias" id="dias">
</select>
<br><br>
mes ida:<select name="elmes" id="elmes">
</select>
<br><br>
dia regreso:<select name="dias2" id="dias2">
</select>
<br><br>
mes regreso:<select name="elmes2" id="elmes2">
</select>
</form>
</body>
</html>
Lo que hace es que recupera la fecha del sistema y en los dos primeros selects aparece el día y el mes en el que nos encontramos. Lo que no he conseguido es que en los dos selects siguientes, día y mes de regreso, aparezca la fecha siguiente a la fecha del sistema y que controle que si es 31 de enero aparezca 1 de febrero o que si es 28 de febrero aparezca 1 de marzo, y así con todos los meses. Imagino, por lo que he intentado, que se puede conseguir a base de hacer bucles for y condicionales, pero no doy con la fórmula exacta. ¿Podrías ayudarme o indicarme dónde conseguir un código que me ayude?

1 Respuesta

Respuesta
1
No me molestas, hombre, intento ayudar...
Aquí te va:
<html>
<head>
<script type="text/javascript">
hoy=new Date();
//hoy.setDate(28);
manyana = new Date();
manyana.setDate(hoy.getDate()+1);
num=((hoy.getDate()<10) ? "0" : "")+hoy.getDate();
meses=['enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'];
diasxMes=[31,28,31,30,31,30,31,31,30,31,30,31];
function setMes(hoyOManyana, id){
var sel = this.document.getElementById(id);
while(sel.hasChildNodes())
sel.removeChild(sel.lastChild);
for (var i=0;i<12;i++){
opt = new Option();
opt.value = i ;
opt.text = meses;
if(hoyOManyana==0){
if (hoy.getMonth()==i) {opt.selected=true;}
}else if(hoyOManyana==1){
if (manyana.getMonth()==i) {opt.selected=true;}
}
sel.options = opt;
}
}
function setDias(hoyOManyana, dias, id){
var sel = this.document.getElementById(id);
while(sel.hasChildNodes())
sel.removeChild(sel.lastChild);
for (var i=1;i<=dias;i++){
opt = new Option();
opt.value = i;
opt.text = i;
if(hoyOManyana == 0){
if (hoy.getDate()==i) {opt.selected=true;}
}else if(hoyOManyana == 1){
if (manyana.getDate()==i) {opt.selected=true;}
}
sel.options[i-1] = opt;
}
}
function setSelects(){
setMes(0, "elmes");
setDias(0, diasxMes[hoy.getMonth()],"dias");
setMes(1, "elmes2");
setDias(1, diasxMes[manyana.getMonth()],"dias2");
}
</script>
</head>
<body onload="setSelects();">
<form name="frm">
dia ida:<select name="dias" id="dias">
</select>
<br><br>
mes ida:
<select name="elmes" id="elmes" onChange=setDias(0,diasxMes[this.options[this.selectedIndex].value],"dias");>
</select>
<br><br>
dia regreso:<select name="dias2" id="dias2">
</select>
<br><br>
mes regreso:<select name="elmes2" id="elmes2" onChange=setDias(1,diasxMes[this.options[this.selectedIndex].value],"dias2");>
</select>
</form>
</body>
</html>
Si cambias el día de hoy a 28 (de febrero), veras que el siguiente select tiene como día el 1 y mes a marzo.
Si quieres ir añadiendo mas selects, solo añade:
}else if(hoyOManyana == 2){
...
}else if(hoyOManyana == 3){
...
}
A las funciones y haz las llamadas con el numero correspondiente. Ah! También deberías añadir otro date con "pasadomanyana" o la fecha que quieras que salga en el siguiente select (una fecha por cada select).
Espero que la lógica de como funciona te resulte sencilla de entender.
Buenos días. Primero te pongo los cambios que he hecho:
<html>
<head>
<script type="text/javascript">
var date1 = new Date();
hoy=new Date();
num=((hoy.getDate()<10) ? "0" : "")+hoy.getDate();
mes=hoy.getMonth();
meses=['enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'];
diasxMes=[31,28,31,30,31,30,31,31,30,31,30,31];
Mes=meses[mes];
var diasMes = new Array();
diasMes[0] = 31;
diasMes[1] = 28;
diasMes[2] = 31;
diasMes[3] = 30;
diasMes[4] = 31;
diasMes[5] = 30;
diasMes[6] = 31;
diasMes[7] = 31;
diasMes[8] = 30;
diasMes[9] = 31;
diasMes[10] = 30;
diasMes[11] = 31;
function generarSelect(dias){
var sel = this.document.getElementById("dias");
var opt;
for(i=0;i<dias;i++){
opt = document.createElement("option");
opt.setAttribute("value", i);
opt.appendChild(document.createTextNode(i+1));
sel.appendChild(opt);
}
}
function setmes(){
for (var i=0;i<12;i++){
opt = new Option();
opt.value = meses ;
opt.text = meses;
if (mes==i) {opt.selected=true;}
document.getElementById('elmes').options = opt;
}
}
function setDias(){
for (var i=1;i<=diasxMes[mes];i++){
opt = new Option();
opt.value = i;
opt.text = i;
if (hoy.getDate()==i) {opt.selected=true;}
document.getElementById('dias').options[i-1] = opt;
}
}
function setRegresodias(){
date1.setDate(date1.getDate()+1);
date1.getMonth();
}
function setSelects(){
setmes();
setDias();
setRegresodias();
}
</script>
</head>
<body onload="setSelects();">
<form name="frm">
dia ida:<select name="dias" id="dias">
</select>
<br><br>
mes ida:<select name="elmes" id="elmes" onChange=generarSelect(diasMes[this.options[this.selectedIndex].value]);>
</select>
<br><br>
dia regreso:<select name="dias2" id="dias2">
</select>
<br><br>
mes regreso:<select name="elmes2" id="elmes2">
</select>
</form>
</body>
</html>
Como verás, añado una función setRegresodias() pero no sé cómo hacer para que esos valores del día y del mes se recojan en su respectivo select de regreso. Con eso ya podría comprobar si se pone el día siguiente a la fecha del sistema, aunque imagino que sí.
En cuanto a la actualización de los selects según el mes que yo escoja, he añadido lo que me has dicho pero no me funciona, aunque es posible que haya hecho algo mal.
Si me pudieses hacer las correcciones que creas convenientes y todo funcionase bien, ya te dejaría de molestar :))
Muchas gracias nuevamente. Un saludo.
Al hacer día + 1, el date que usas ya pasa el día, mes y año si corresponde, de modo que en el segundo select puedes poner date1. GetMonth(), que sera el mes que toque con el día sumado, no necesitas hacer nada más, solo usar el valor de la fecha.
Para lo segundo, creo que lo más sencillo es que te hagas un array de fechas:
var diasMes = new Array();
diasMes[0] = 31;
diasMes[1] = 28; // ojo a los bisiestos
diasMes[2] = 31;
diasMes[3] = 30;
diasMes[4] = 31;
diasMes[5] = 30;
diasMes[6] = 31;
diasMes[7] = 31;
diasMes[8] = 30;
diasMes[9] = 31;
diasMes[10] = 30;
diasMes[11] = 31;
y despues rehaces el select de los dias segun el mes que se haya seleccionado:
<select id=dias name=dias>
</select>
function generarSelect(dias){
var sel = this.document.getElementById("dias");
var opt;
for(i=0;i<dias;i++){
opt = document.createElement("option");
opt.setAttribute("value", i);
opt.appendChild(document.createTextNode(i+1));
sel.appendChild(opt);
}
}
En el select del mes, pones un onChange= generarSelect(diasMes[this.options[this.selectedIndex].value]);
Así, al cambiar de selección, se generara el nuevo select de los días según el numero de días necesarios... aunque no lo he probado, creo que debería ir todo bien.
Espero que te ayude, si necesitas algo más, no dudes en seguir preguntando.
Es mucho más sencillo de lo que pretendes.
Si tienes una fecha:
var date1 = new Date();
puedes ir al dia siguiente haciendo:
date1.setDate(date1.getDate()+1);
Es decir, sumando 1 a la fecha. El paso de meses, etc se hace automáticamente, incluso el de años.
Buenas tardes. La verdad es que así visto... sí parece mucho más sencillo. De hecho, yo me imaginaba que algo así se podría hacer pero no se me pasó por la cabeza. Aún así, te pido una aclaración al respecto y te planteo otra duda.
La aclaración es que yo quiero que el tercer select recoja el día + 1 y el cuarto select recoja el mes (el mismo mes o el mes siguiente, dependiendo del día). Con lo que tú me has dado, ¿tengo qué hacer una función nueva? Imagino que sí, pero al tener 2 selects, ¿cómo hago para que cada uno recoja lo que yo quiero? Aunque parezca que yo sé de ésto... realmente estoy muy verde.
La duda es si existe algún método sencillo para que, al seleccionar en los selects que manejan la fecha de regreso un mes distinto que tenga más o menos días que el de la fecha de sistema, se actualice y aparezca el mes con todos sus días. Es decir, ahora estamos en febrero y hay 28 días. La fecha de hoy es 8 de febrero, que es lo que aparece en los 2 primeros selects. En los otros 2 selects aparecerá 9 de febrero. Pero lo que pretendo, si es sencillo, es que al seleccionar marzo o abril, el select con los días tenga 31 días o 30, dependiendo del caso.
Me interesa más lo primero que lo segundo. Espero que puedas ayudarme con ésto. Muchas gracias de nuevo. Un saludo.
Buenos días. La verdad es que me parece que ahora sí está. Ayer conseguí, aunque de un modo bastante diferente, conseguir que cambiase el select de los días de regreso y se ajustase al mes que debía, pero con tu ejemplo está todo completo.
Tan solo me queda una duda con respecto a lo que me dices de añadir más selects. ¿Con qué fin haría eso? Es que a lo mejor se me está escapando algo y quiero tener este ejemplo bien hecho. ¿Te refieres a que le pueda añadir dos selects más que hagan referencia al año?
Espero que la próxima vez pueda finalizar la preungta ;)
Muchísimas gracias por todo. Un saludo.
Muchas gracias por todo, la verdad es que me ha servido de muchísimo lo que has hecho. Un saludo.
Me refería a que igual que ahora tienes dos select, uno con el día de "hoy" y otro con el de "mañana", si quieres poner otro con "pasado mañana", lo puedes hacer como te comentaba.
Te agradecería que, si todo esta claro, me finalices la pregunta, para que no se me quede colgada, ¿ok?
Me alegra haberte ayudado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas