Foros del Web » Programando para Internet » Javascript »

Sumar meses a una fecha

Estas en el tema de Sumar meses a una fecha en el foro de Javascript en Foros del Web. El script que diste tiene un ERROR, cuando pones la fecha con el mes 08 o 09 y le sumas 1 o mas meses calcula ...
  #1 (permalink)  
Antiguo 21/09/2007, 22:05
 
Fecha de Ingreso: septiembre-2007
Mensajes: 150
Antigüedad: 16 años, 7 meses
Puntos: 1
Sumar meses a una fecha

El script que diste tiene un ERROR, cuando pones la fecha con el mes 08 o 09 y le sumas 1 o mas meses calcula con error, por ejemplo 01/08/2005 + 1 mes te da como resultado 01/01/2005, lo mismo pasa con el mes 09.
Saludos.

<html>
<head>
<script language="JavaScript">
function cerosIzq(sVal, nPos){
var sRes = sVal;
for (var i = sVal.length; i < nPos; i++)
sRes = "0" + sRes;
return sRes;
}

function armaFecha(nDia, nMes, nAno){
var sRes = cerosIzq(String(nDia), 2);
sRes = sRes + "/" + cerosIzq(String(nMes), 2);
sRes = sRes + "/" + cerosIzq(String(nAno), 4);
return sRes;
}

function sumaMes(nDia, nMes, nAno, nSum){
if (nSum >= 0){
for (var i = 0; i < Math.abs(nSum); i++){
if (nMes == 12){
nMes = 1;
nAno += 1;
} else nMes += 1;
}
} else {
for (var i = 0; i < Math.abs(nSum); i++){
if (nMes == 1){
nMes = 12;
nAno -= 1;
} else nMes -= 1;
}
}
return armaFecha(nDia, nMes, nAno);
}

function calcula(){
var sFc0 = document.frm.fecha0.value; // Se asume válida
var nSum = parseInt(document.frm.meses.value);
var sFc1 = sFc0;
if (!isNaN(nSum)){
var nDia = parseInt(sFc0.substr(0, 2));
var nMes = parseInt(sFc0.substr(3, 2));
var nAno = parseInt(sFc0.substr(6, 4));
sFc1 = sumaMes(nDia, nMes, nAno, nSum);
}
document.frm.fecha1.value = sFc1;
}
</script>
</head>
<body>
<form name="frm">
<table border="0">
<tr>
<td>
<table border="1">
<tr>
<td align="right">
Fecha inicial (dd/mm/aaaa)
</td>
<td>
<input type="text" name="fecha0" value="21/03/2002">
</td>
</tr>
<tr>
<td align="right">
Meses
</td>
<td>
<input type="text" name="meses" value="0">
</td>
</tr>
<tr>
<td align="right">
Fecha final (dd/mm/aaaa)
</td>
<td>
<input type="text" name="fecha1" readonly>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center">
<input type="button" value="Calcular" onclick="calcula()">
</td>
</tr>
</table>
</form>
</body>
</html>
  #2 (permalink)  
Antiguo 21/09/2007, 22:14
 
Fecha de Ingreso: septiembre-2007
Mensajes: 150
Antigüedad: 16 años, 7 meses
Puntos: 1
Exclamación Reemplazar varios caracteres en campo de texto

Hola, como es posible reemplazar mas de 1 caracter
al escribir en un campo de texto, por ejemplo, que reemplaze
el caracter "z" por "a" y el caracter "r" por "t",
es decir que si escribe mas de una variable.
Por que he tratado pero solo consigo "za" por "rt" y no
por separado.
Ayuda Pls con un ejemplo que sea.
  #3 (permalink)  
Antiguo 22/09/2007, 09:16
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: FAQs JavaScript

Hola:

Puedes concatenar replace()'s:
Código PHP:
"zutra".replace("z","a").replace("r","t"); 
También podrías trabajar con expresiones regulares para que reemplace todas las zetas y todas las erres:
Código PHP:
"zutragarra".replace(/z/g,"a").replace(/r/g,"t"); 
También podemos almacenar los reemplazos en un array y luego aplicarlos (ojo con el código):
Código PHP:
// Declaramos la matriz de reemplazos
var reemplazos = new Array();
reemplazos["z"] = "a";
reemplazos["r"] = "t";

// O un equivalente más cómodo y bonito
var reemplazos = {
    
"z""a",
    
"r""t"
};

var 
str "zutragarra";
str str.replace( /[a-z]/g, function($1) {
    return 
reemplazos[$1] || $1;
} );

document.write(str); 

Un saludo
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #4 (permalink)  
Antiguo 24/09/2007, 13:56
 
Fecha de Ingreso: septiembre-2007
Mensajes: 150
Antigüedad: 16 años, 7 meses
Puntos: 1
Re: FAQs JavaScript

Derdenuke, vi tu ejemplo como hacerlo en PHP pero como se haria en Javascript???
podrias dar un ejemplo, gracias

Cita:
Iniciado por derkenuke Ver Mensaje
Hola:

Puedes concatenar replace()'s:
Código PHP:
"zutra".replace("z","a").replace("r","t"); 
También podrías trabajar con expresiones regulares para que reemplace todas las zetas y todas las erres:
Código PHP:
"zutragarra".replace(/z/g,"a").replace(/r/g,"t"); 
También podemos almacenar los reemplazos en un array y luego aplicarlos (ojo con el código):
Código PHP:
// Declaramos la matriz de reemplazos
var reemplazos = new Array();
reemplazos["z"] = "a";
reemplazos["r"] = "t";

// O un equivalente más cómodo y bonito
var reemplazos = {
    
"z""a",
    
"r""t"
};

var 
str "zutragarra";
str str.replace( /[a-z]/g, function($1) {
    return 
reemplazos[$1] || $1;
} );

document.write(str); 

Un saludo
  #5 (permalink)  
Antiguo 24/09/2007, 17:41
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: 36.- Sumar meses a una fecha

¿Quién ha hablado de PHP?
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #6 (permalink)  
Antiguo 24/09/2007, 21:59
 
Fecha de Ingreso: septiembre-2007
Mensajes: 150
Antigüedad: 16 años, 7 meses
Puntos: 1
Re: 36.- Sumar meses a una fecha

Puchas, es que soy muy novato en esto podrias mostrarme un ejemplo para que me quedace mas claro, muchas gracias por tu tiempo master.
  #7 (permalink)  
Antiguo 24/09/2007, 22:00
 
Fecha de Ingreso: septiembre-2007
Mensajes: 150
Antigüedad: 16 años, 7 meses
Puntos: 1
Re: 36.- Sumar meses a una fecha

por que la idea es que cuando alguien este escribiendo se reemplazen las letras que yo defino por ej, en onkeyup haga la llamada a un script predefinido con los caracteres a reemplazar.
  #8 (permalink)  
Antiguo 25/09/2007, 14:19
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: 36.- Sumar meses a una fecha

Hola de nuevo alexisfch:

Voy a hacerte un ejemplo in situ, a ver si no cometo muchos fallos:

Código PHP:
<input type="text" onkeyup="sustituir(this)" />
<
script type="text/javascript">
function 
sustituir(campo) {
  
campo.value campo.value.replace(/z/g,"a").replace(/r/g,"t");  
}
</script> 
Esa sería la idea para reemplazar toda zeta y toda erre por aes y tés respectivamente. Todo esto se hace al soltar la tecla pertinente en el teclado.


A ver si consigues hacerlo funcionar.


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #9 (permalink)  
Antiguo 26/09/2007, 12:38
 
Fecha de Ingreso: septiembre-2007
Mensajes: 150
Antigüedad: 16 años, 7 meses
Puntos: 1
Re: 36.- Sumar meses a una fecha

Probe el codigo que me diste y funciona perfecto, d ehecho me sirvio mucho, pero el unico problema es que cuando pongo por ejemplo:

replace(/a/g,"b").replace(/b/g,"c");

cuando escribo "a" en el campo me la reemplaza de inmediato por "c" en vez de por "b", como podrias hacerlo para que por ejemplo hiciera solo un reemplazo y no todos los replace???

Saludos
  #10 (permalink)  
Antiguo 26/09/2007, 17:20
 
Fecha de Ingreso: septiembre-2007
Mensajes: 150
Antigüedad: 16 años, 7 meses
Puntos: 1
Exclamación Sumar Meses a una Fecha en Javascript

Hola, alguiewn sabe como sumar un x cantidad de meses a una fecha dada(DD/MM/YYYY) ?, considerando que despues del mes 12 viene el 1 y que febrero tiene 28 dias y algunos meses 30 o 31 dias. En este foro encontre este script, pero tiene un error ya que cuando por ejemplo pones el mes 08 o 09 los considera como mes 12 y por ejemplo 05/08/2005 + 1 mes = 05/01/2006 pasa lo mismo con el mes 09.
Saludos.

Código HTML:
<html> 
<head> 
<script language="JavaScript"> 
function cerosIzq(sVal, nPos){ 
var sRes = sVal; 
for (var i = sVal.length; i < nPos; i++) 
sRes = "0" + sRes; 
return sRes; 
} 

function armaFecha(nDia, nMes, nAno){ 
var sRes = cerosIzq(String(nDia), 2); 
sRes = sRes + "/" + cerosIzq(String(nMes), 2); 
sRes = sRes + "/" + cerosIzq(String(nAno), 4); 
return sRes; 
} 

function sumaMes(nDia, nMes, nAno, nSum){ 
if (nSum >= 0){ 
for (var i = 0; i < Math.abs(nSum); i++){ 
if (nMes == 12){ 
nMes = 1; 
nAno += 1; 
} else nMes += 1; 
} 
} else { 
for (var i = 0; i < Math.abs(nSum); i++){ 
if (nMes == 1){ 
nMes = 12; 
nAno -= 1; 
} else nMes -= 1; 
} 
} 
return armaFecha(nDia, nMes, nAno); 
} 

function calcula(){ 
var sFc0 = document.frm.fecha0.value; // Se asume válida 
var nSum = parseInt(document.frm.meses.value); 
var sFc1 = sFc0; 
if (!isNaN(nSum)){ 
var nDia = parseInt(sFc0.substr(0, 2)); 
var nMes = parseInt(sFc0.substr(3, 2)); 
var nAno = parseInt(sFc0.substr(6, 4)); 
sFc1 = sumaMes(nDia, nMes, nAno, nSum); 
} 
document.frm.fecha1.value = sFc1; 
} 
</script> 
</head> 
<body> 
<form name="frm"> 
<table border="0"> 
<tr> 
<td> 
<table border="1"> 
<tr> 
<td align="right"> 
Fecha inicial (dd/mm/aaaa) 
</td> 
<td> 
<input type="text" name="fecha0" value="21/03/2002"> 
</td> 
</tr> 
<tr> 
<td align="right"> 
Meses 
</td> 
<td> 
<input type="text" name="meses" value="0"> 
</td> 
</tr> 
<tr> 
<td align="right"> 
Fecha final (dd/mm/aaaa) 
</td> 
<td> 
<input type="text" name="fecha1" readonly> 
</td> 
</tr> 
</table> 
</td> 
</tr> 
<tr> 
<td align="center"> 
<input type="button" value="Calcular" onclick="calcula()"> 
</td> 
</tr> 
</table> 
</form> 
</body> 
</html> 
  #11 (permalink)  
Antiguo 26/09/2007, 17:33
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: 36.- Sumar meses a una fecha

Sí, ese sería el problema del código.

Intenta poner el código para que no funcione la sustitución con lo que ya has sustituido (en el ejemplo que posteas, valdría con cambiar de orden los replace()).

Si no puedes hacer eso... veo la cosa más complicada. Ten en cuenta que la programación en javascript es secuencial, y que cada sentencia se ejecuta por orden. Es decir, lo que haga la anterior está disponible para la siguiente. No puedes ejecutar dos sentencias a la vez que es lo que necesitas.


Es que este problema se me planteó desde el primer momento que posteaste tu duda. Con las expresiones regulares, una vez que miras un caracter, ya sigues hacia delante y no lo vuelves a comprobar. Podría ser como un bucle que va comprobando caracter por caracter (también se podría hacer con este bucle).

Este ejemplo funciona para la primera "a" (se sustituye por b). Luego si introduces otra letra, hará otra pasada y esta nueva "b" se sustituirá por "c":

Código PHP:
<input type="text" onkeyup="sustituir(this)" />

<
script type="text/javascript">

var 
reemplazos = {
    
"a""b",
    
"b""c"
};

function 
sustituir(campo) {
    
campo.value campo.value.replace( /[a-z]/g, function($1) {
        return 
reemplazos[$1] || $1;
    } );
}

</script> 
Lo que sí podríamos hacer es "engañar", detectando la tecla que se ha pulsado, y sólo sustituyendo ésta:
Código PHP:
<input type="text" onkeyup="sustituir(event, this)" />

<
script type="text/javascript">

var 
reemplazos = {
    
"a""b",
    
"b""c"
};

function 
sustituir(evtcampo) {
    var 
key = (window.event) ? window.event.keyCode evt.which;
    var 
esLetra = ( (key 64 && key 91) || (key 96 && key 123) || (key==165) || (key==164) || (key==32) || (key==209) || (key==241) );
    if( 
esLetra ) {
        var 
ultimoCaracter String.fromCharCode(key).toLowerCase();
        
campo.value campo.value.substring(0campo.value.length-) + ultimoCaracter.replace( /[a-z]/g, function($1) {
            return 
reemplazos[$1] || $1;
        } );
    }
}

</script> 
Lo que no sé es por qué me está detectando la letra en mayúsculas, le he tenido que poner un toLowerCase() provisional, porque no he podido encontrar el error.



A ver si así te puedes hacer un apaño, a mi me ha funcionado bien, pero ya te digo: minúsculas.


Un saludo
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 20:22.