Foros del Web » Programación para mayores de 30 ;) » Java »

Para pensar, a no ser que alguien me de una solucion!

Estas en el tema de Para pensar, a no ser que alguien me de una solucion! en el foro de Java en Foros del Web. Hola a todos! Disculpen por el título de la pregunta, pero esque no sabía cómo explicarlo. Resulta que tengo dos fechas en modo string. Lo ...
  #1 (permalink)  
Antiguo 25/10/2008, 06:02
 
Fecha de Ingreso: febrero-2006
Mensajes: 174
Antigüedad: 18 años, 2 meses
Puntos: 0
Para pensar, a no ser que alguien me de una solucion!

Hola a todos!

Disculpen por el título de la pregunta, pero esque no sabía cómo explicarlo.

Resulta que tengo dos fechas en modo string. Lo que quiero hacer es desglosar estas fechas por meses, por ejemplo:

me dan : 25-9-08 hasta 1-3-09

y quiero tener

25-9-08 -- 1-10-08
1-10-08 -- 1-11-08
1-11-08 -- 1-12-08
1-12-08 -- 1-1-09
1-1-09 -- 1-2-09
1-2-09 -- 1-3- 09

estoy haciendo a mano un algoritmo que lo haga, pero esq me estoy volviendo loca. Igual hay algun metodo mejor, pero esq con la clase Date y Calendar no se me ocurre cómo hacerlo.

Además, haciéndolo "a mano", hay tres casos posibles: (1) que el periodo esté dentro del mismo año (1-2-08 hasta 25-9-08), (2) que el periodo cambie de año pero dure menos de un año (1-11-08 hasta 20 -3-09) , (3) que el periodo cambie de año y además dure más de un año (1-2-08 hasta 5-6-09). Os pongo el algoritmo que he ido haciendo. Me da muchos fallos y espero que alguien me proponga una solución que no suponga este trabajo de chinos!!!!


Código:
	public static void main (String[] args){
		String fechaini="25/10/2008";
		String fechafin="25/12/2008";
		
		StringTokenizer st=new StringTokenizer(fechaini,"/");
		String diaini=st.nextToken(); int diai=Integer.parseInt(diaini);
		String mesini=st.nextToken();int mesi=Integer.parseInt(mesini);
		String anhoini=st.nextToken();int anhoi=Integer.parseInt(anhoini);
		
		StringTokenizer st2=new StringTokenizer(fechafin,"/");
		String diafin=st2.nextToken();int diaf=Integer.parseInt(diafin);
		String mesfin=st2.nextToken();int mesf=Integer.parseInt(mesfin);
		String anhofin=st2.nextToken();int anhof=Integer.parseInt(anhofin);
		
		
		//siguientes periodos
		int anho=anhoi;
		for(int j=anhoi; j<anhof;j++){ //por si se quiere un historial de más de un año
			
			if(mesi<mesf){ //periodo dentro del mismo año
				//primer periodo
				String p1=fechaini+"---"+"1/"+(mesi+1)+"/"+anhoini;				
				System.out.println("primerperiodo:"+p1);
				
				//siguientes periodos
				for(int i=mesi+1; i<mesf-1; i++ ){
					System.out.println("1");
					String pi;					
					pi="1/"+i+"/"+anhoi+"---"+"1/"+(i+1)+"/"+anhoini;					
					System.out.println("periodo"+i+":"+pi);
				}
				//ultimo periodo
				
				String pu="1/"+(mesf-1)+"/"+anho+"---"+fechafin;
				System.out.println("ultimo periodo pu:" +pu);
			}else if((mesi<mesf)&&(anhoi<anhof)){ //cambiamos de año y el periodo dura más de un año
					for(int a=anhoi;a<anhof;a++){
						 String p1=fechaini+"---"+"1/"+(mesi+1)+"/"+anhoini;					
						 System.out.println("primerperiodo:"+p1);
				
						for (int k=mesi+1;k<=12;k++){
							String pk="1/"+k+"/"+anho+"---"+"1/"+(k+1)+"/"+anho;	
							System.out.println("periodo pk:"+pk);
						}
				}
				
			
			}else{ //cambiamos de año y el periodo dura MENOS de un año
				
				//primer periodo
				String p1;
				if(mesi==12){
					 p1=fechaini+"---"+"1/"+(mesi+1)+"/"+(anhoini+1);
				}else{
					 p1=fechaini+"---"+"1/"+(mesi+1)+"/"+anhoini;
				}
				System.out.println("primerperiodo:"+p1);
				
				//siguientes periodos
				for (int k=mesi+1;k<12;k++){
					String pk="1/"+k+"/"+anho+"---"+"1/"+(k+1)+"/"+anho;	
					System.out.println("periodo pk:"+pk);
				}
				
				//ultimo periodo de ese año
				String pe="1/12/"+anho+"---"+"1/1/"+(anho+1);	
				System.out.println("periodo pk:"+pe);
				
				//cambiamos de año
				anho++;
				for(int f=1; f<mesf-1; f++){
					String pf="1/"+f+"/"+anho+"---"+"1/"+(f+1)+"/"+anho;
					System.out.println("periodo pf:"+pf);
				}
				
				//ultimo periodo
				
					String pu="1/"+(mesf-1)+"/"+anho+"---"+fechafin;
					System.out.println("ultimo periodo pu:" +pu);
									
			}
		}
			
		
	}
	
}
Muchísimas gracias si alguien lo intenta!!
  #2 (permalink)  
Antiguo 25/10/2008, 09:06
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Para pensar, a no ser que alguien me de una solucion!

Con la clase Calendar no necesitarías distinguir entre un año o menos, el mismo año o diferente etc.

Basta con saltar al dia 1 de los meses e ir añadiendo de 1 mes en un mes hasta que la fecha sea mayor que la fecha de fin, como condición para terminar. Todo eso lo puedes hacer a través del API de Calendar.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 27/10/2008, 08:14
 
Fecha de Ingreso: febrero-2006
Mensajes: 174
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Para pensar, a no ser que alguien me de una solucion!

Intento hacerlo con calendar, pero sigo teniendo problemas

La cosa es que si empezamos el 15-4-2008, el primer periodo debería ser

15-4-2008 -- 1-5-2008
1-5-2008 -- 1-6-2008

Cómo puedo sacar ese primer periodo?
Código:
public class c {
	
	public static void main (String[] args){
		
	try {    
			 String fini="2-4-2008";
			 DateFormat formatter ; 
			 Date date ; 
			 formatter = new SimpleDateFormat("dd-MM-yyyy");
             date = formatter.parse(fini); 
             Calendar cal_ini=Calendar.getInstance();
             cal_ini.setTime(date);   
             

			 String ffin="5-7-2009";
			 DateFormat formatter2 ; 
			 Date date2 ; 
			 formatter2 = new SimpleDateFormat("dd-MM-yyyy");
             date2 = formatter2.parse(ffin); 
             Calendar cal_fin=Calendar.getInstance();
             cal_fin.setTime(date2);
                          
             
             //primer periodo
         /*    System.out.println("periodo1:"+cal_ini.getTime());       
          
             Calendar f=cal_ini;
             f.add(Calendar.MONTH,1);
             System.out.println("f:"+f.getTime()+"mes"+f.get(Calendar.MONTH)+"año"+f.get(Calendar.YEAR));
			 DateFormat form = new SimpleDateFormat("dd-MM-yyyy");
             Date d = form.parse("1-"+(f.get(Calendar.MONTH))+1+"-"+f.get(Calendar.YEAR)); 
             Calendar cal=Calendar.getInstance();
             cal.setTime(d);
             
             System.out.println("cal:"+cal.getTime());       
           */  
             Calendar fecha=cal_ini;
             
             while(fecha.before(cal_fin)){
            	 cal_ini.get(Calendar.MONTH);
            	 fecha.add(Calendar.MONTH, 1);
            	 System.out.println("fecha"+fecha.getTime());
            	 System.out.println("fecha mes:"+fecha.get(Calendar.MONTH));
             }
             
             
    } catch (Exception e){
    	System.out.println("Exception :"+e);    }   
     
   }

}
gracias
  #4 (permalink)  
Antiguo 27/10/2008, 08:47
 
Fecha de Ingreso: febrero-2006
Mensajes: 174
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Para pensar, a no ser que alguien me de una solucion!

Solo me falta una cosita

al hacer

Calendar fin=cal_fin;
fin.add(Calendar.MONTH,-1);


Luego hago
System.out.println("ultimo periodo:"+cal_fin.getTime());

y a cal_fin se le ha quitado un mes, es decir, que el hacer fin.add(Calendar.MONTH,-1) no sólo se le aplica a fin, si no también a cal_fin.

¿Cómo puede ser eso?

Pongo el código y la salida

Código:
public class c {
	
	public static void main (String[] args){
		
	try {    
			 String fini="22-4-2008";
			 DateFormat formatter ; 
			 Date date ; 
			 formatter = new SimpleDateFormat("dd-MM-yyyy");
             date = formatter.parse(fini); 
             Calendar cal_ini=Calendar.getInstance();
             cal_ini.setTime(date);   
             System.out.println("fecha inicial:"+cal_ini.getTime());

			 String ffin="5-12-2008";
			 DateFormat formatter2 ; 
			 Date date2 ; 
			 formatter2 = new SimpleDateFormat("dd-MM-yyyy");
             date2 = formatter2.parse(ffin); 
             Calendar cal_fin=Calendar.getInstance();
             cal_fin.setTime(date2);
             System.out.println("fecha final:"+cal_fin.getTime());
                          
             
             //primer periodo
             System.out.println("periodo1:"+cal_ini.getTime());       
          
             Calendar f=cal_ini;
             f.add(Calendar.MONTH,1);
            
			 DateFormat form = new SimpleDateFormat("dd-MM-yyyy");
             Date d = form.parse("1-"+((f.get(Calendar.MONTH))+1)+"-"+f.get(Calendar.YEAR)); 
             Calendar cal=Calendar.getInstance();
             cal.setTime(d);
                   
            
             Calendar fecha=cal;
             
             //hasta cuándo iterar                   
             
             Calendar fin=cal_fin;  
             fin.add(Calendar.MONTH,-1);
            
			 DateFormat formf = new SimpleDateFormat("dd-MM-yyyy");
             Date df = formf.parse("1-"+((fin.get(Calendar.MONTH))+1)+"-"+fin.get(Calendar.YEAR)); 
             Calendar calf=Calendar.getInstance();
             calf.setTime(df);
                        
            
             
             while(fecha.before(calf)){
            	 cal_ini.get(Calendar.MONTH);
            	 fecha.add(Calendar.MONTH, 1);
            	 System.out.println("fecha"+fecha.getTime());
             }
             System.out.println("ultimo periodo:"+cal_fin.getTime());
             
             
    } catch (Exception e){
    	System.out.println("Exception :"+e);    }   
     
   }

}

salida:
Cita:
fecha inicial:Tue Apr 22 00:00:00 CEST 2008
fecha final:Fri Dec 05 00:00:00 CET 2008
periodo1:Tue Apr 22 00:00:00 CEST 2008
fechaSun Jun 01 00:00:00 CEST 2008
fechaTue Jul 01 00:00:00 CEST 2008
fechaFri Aug 01 00:00:00 CEST 2008
fechaMon Sep 01 00:00:00 CEST 2008
fechaWed Oct 01 00:00:00 CEST 2008
fechaSat Nov 01 00:00:00 CET 2008
ultimo periodo:Wed Nov 05 00:00:00 CET 2008
y ya de paso, cómo puedo convertir

Tue Apr 22 00:00:00 CEST 2008

en

22-4-2008

???

gracias
  #5 (permalink)  
Antiguo 27/10/2008, 12:17
 
Fecha de Ingreso: agosto-2008
Mensajes: 19
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Para pensar, a no ser que alguien me de una solucion!

Código PHP:
private String ValidateNumber(int num){
        
String number;
            if(
num 10
                
number "0"+num;
            else
                
number ""+num;
        return 
number;
    }        

public 
String getFechaHora(Calendar calendario) {

    
String fecha_format;
    
String diames;
    
int year;   
    
    
dia ValidateNumber(calendario.get(Calendar.DAY_OF_MONTH));
    
mes ValidateNumber(calendario.get(Calendar.MONTH)+1);
    
year calendario.get(Calendar.YEAR);  

    
fecha_format dia +"-"mes +"-"year;
    return 
fecha_format;

  } 
y lo imprimes asi:

System.out.println("ultimo periodo: "+objcal.getFechaHora(cal_fin));

Resultado:

ultimo periodo: 05-11-2008
  #6 (permalink)  
Antiguo 27/10/2008, 13:24
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Para pensar, a no ser que alguien me de una solucion!

Cita:
Iniciado por xayide Ver Mensaje
Solo me falta una cosita

al hacer

Calendar fin=cal_fin;
fin.add(Calendar.MONTH,-1);


Luego hago
System.out.println("ultimo periodo:"+cal_fin.getTime());

y a cal_fin se le ha quitado un mes, es decir, que el hacer fin.add(Calendar.MONTH,-1) no sólo se le aplica a fin, si no también a cal_fin.

¿Cómo puede ser eso?
fin y cal_fin son el mismo objeto apuntado por dos variables diferentes, así que cuando cambias el objeto a través de uno de los "nombres", se cambia en los dos. Si quieres una copia, prueba con Calendar fin = (Calendar)cal_fin.clone(); por ejemplo.


Cita:
Iniciado por xayide Ver Mensaje
y ya de paso, cómo puedo convertir

Tue Apr 22 00:00:00 CEST 2008

en

22-4-2008

???

gracias
En una palabra: SimpleDateFormat .

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:52.