0 votos

Hola. Primero gracias por existir.

Trato de hacer una aplicacion para mi trabajo, lo hago a turnos con esta cadencia - TLTTLLLL-.La idea es de hace un año con cero conocimientos de java y cero de android. La vista calendario no es mia. Para saber los dias de trabajo creo un metodo :

public List<String>  diasdeTrabajo(){
	 	    
	 		int GUARDIACUATRO1 =16071;
	 		SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy");
	 	 Calendar cal = GregorianCalendar.getInstance();
	      Date date = null;
	 		 
	 	  for (int i=0; i< dias.size() ; i++){ 
	 			 try {
					 date = formato.parse(dias.get(i)); 
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 
	 			cal.setTime(date);
	 			Long dia= cal.getTimeInMillis();
	 			dia = dia/(1000*60*60*24);
	 			 dia =dia-GUARDIACUATRO1 ;
	 			 int seg2 = (int) (dia % 8);
	 			    if(seg2 ==1 || seg2 == 3|| seg2== 4){
	 			 	 list.add(dias.get(i)+"-CURRO"); 
	 			    }else{  
	 			   list.add(dias.get(i)+"-WHITE");
	 				 }
	 		 }
	 	 	    return list;
                    }

Le paso los "dias" del mes en formato ddMMyy. y me deuelve "list" con los que trabajo y no. Los que trabajo los pongo en rojo. Bueno pues me hace correcto el mes de enero, febrero,abril, junio, agosto, septiembre y noviembre. Marzo lo adelanta tres dias el resultado y mayo julio, octubre y diciembre lo hace un dia.

No entiendo que pasa. Puedo pensar que es con los dias de los meses (30, 31, 28), pero no se solucionarlo.

la cte GUARDIACUATRO son los dias entre 1de enero de 2014 y el 1 de enero de 1970.

No se si se puede enviar archivos adjuntos. Pero les dejo un enlace con el rar del proyecto solo con la vista y el metodo: https://www.dropbox.com/s/5s7qur50duwaupm/MyCalendarActivity.zip?dl=0.

Por favor me podria indicar alguna linea para poder seguir.

Repito de todos modos muchas gracias por compartir conocimientos de forma tan clara y util.

Un saludo

preguntado por tinodiez Ene 19, 2015 en Android

1 Respuesta

0 votos
Mejor respuesta
He estado mirando tu código y veo bien el código.

Pienso que puedes tener un problema con los decimales en el cálculo del día.

Supondré que "dias" viene en el formato "dd-MM-yyyy", por ejemplo "31-12-2015". Para esa fecha, si sigo la fórmula que me has puesto:

dia = 1451516400000/86400000 = 16799,9583

Tendrías que redondear el día antes de realizar el módulo.

Otra cosa que te recomiendo, para iniciar el calendario, en vez de restar GUARDIACUATRO, es mirar este ejemplo de código en: http://developer.android.com/reference/java/util/GregorianCalendar.html

Aunque si te funcionan los tres primeros meses y luego empiezan a salir mal... Lo que miraría sería que me estén llegando esos días en el formato correcto al que le estoy diciendo en SimpleDateFormat(). A ver si te están llegando en formato "MM-dd-yyyy" en vez de "dd-MM-yyyy".
respondido por Ramon [Admin] Ene 19, 2015
seleccionada por Ramon [Admin] May 9, 2015

Hola Ramon.

Bien no he tenido mucho tiempo, pero he hecho lo que me indicabas. Lo que era la variable "dias" que eran los del mes en curso en formato "dd-MM-yyyy", lo he sustituido por un String con el mismo formato pero con introduccion manual. El codigo del metodo es:

public static void main(String[] args) throws ParseException {
		// TODO Auto-generated method stub
		SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy");
 	 GregorianCalendar cal = new GregorianCalendar();
 		  
 		 int año = 2014; 
 		 int mes = 00; 
 		 int diaa = 01; //  
 		Calendar calendar = new GregorianCalendar(año,mes,diaa); 
 		 long fecha = calendar.getTimeInMillis();
 		String dias = "29-03-2015";
         Date date = null;
 		 date = formato.parse(dias ); 
		  cal.setTime(date);
 		  long dia = cal.getTimeInMillis();
 			 dia =dia-fecha;
 			 dia=dia/(1000*60*60*24);
 			 int seg2 = (int) (dia % 8);
 			    if(seg2 ==1 || seg2 == 3|| seg2== 4){
 			 	System.out.print("Trabajo el:"+ dia);
 			    }else{  
 			  System.out.print("No trabajo el dia:"+ dia);
 				 }
	}
}

Tal como lo tengo el resultada es el mismo. Los mismos fallos es mas cuando introduzco el "29-03-2015" me da 452 y trabajo. Pero al meter "30-03-2015" me da tambien 452 y obviamente trabajo.

Luego hice la prueba de 28 de febrero es decir "28-01-2015" me da 392 y no trabajo.

Meto el dia siguiente 01-02-2015 y me da 396 y trabajo. Es decir que el "01" no es febrero sino un mes de 31 dias porque cuenta el 29,30,31.

Luego el 31-02-2015   me da 426 y el 01-03-2015  me da 424 dos dias menos

El formato para los dias a estudiar es el indicado pero a la hora de instanciar el calendario de la fecha de origen del calculo "calendar" tiene que ser "yyyy-MM-dd" porque si lo cambio y el set lo pongo como dias, mes, año me salen datos elevadisimo por lo que deduzco que esta mal. He cambiado el format y el resultado es el mismo.

Es decir un desastre.Que hago mal.

Gracias

Hola Ramon.

A pesar del tiempo pasado no he olvidado mi proyecto, lo que pasa es que lo puedo dedicar  muy poco tiempo. El problema al parecer era de compilacion. Me aconsejaron utilizar la clase LocalDate de java.Time de java 8. Bien he probado con esta clase y si es cierto que el problema se soluciona El metodo quedaria compilado solamente en java asi:

public class Calendario {

	/**
	 * @param args
	 * @throws ParseException 
	 */
	public static void main(String[] args) throws ParseException {
		// TODO Auto-generated method stub
		
		   dameCalendario("-01-2015");
	       // dameCalendario("2015-02-");
	        dameCalendario("-03-2015");
	       // dameCalendario("2015-04-");
	        dameCalendario("-05-2015");
	        dameCalendario("-07-2015");
	        
	}
	        
	        public static void dameCalendario(String mesYaño) throws ParseException {
	 
 		  
 		  
 		 LocalDate hoy = LocalDate.now();
 		 LocalDate inicio = LocalDate.of(2014, Month.FEBRUARY,1);
 		//DateTimeFormatter fmt = DateTimeFormatter
		        //.ofLocalizedDate(FormatStyle.SHORT);
 		//		.ofPattern("dd-MM-yyyy");
 		//fmt.format(inicio);
 		LocalDate inicio2 = LocalDate.parse("2014-02-01");
 	//	 DateTimeFormatter fmtinicio = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
 	//	 fmtinicio.format(inicio2);
 		 
 		String dias= "";
 	 
 		  for (int i=1; i<=31;i++) {
          
 	 	  if(i<10){
		 	 dias ="0"+i+mesYaño;		
 		 	  }else{
 		 		  dias= i+mesYaño;
 	 	  }
			DateTimeFormatter dtf=DateTimeFormatter.ofPattern("dd-MM-uuuu");
			LocalDate diasdeTrabajo= LocalDate.parse(dias, dtf);
 	       //    LocalDate diatrabajo = LocalDate.parse(dias);
 	       //   DateTimeFormatter fmtfinal = DateTimeFormatter
 	 		        //.ofLocalizedDate(FormatStyle.MEDIUM);
 	        	//	  .ofPattern("dd-MM-yyyy");
 	         // fmtfinal.format(diatrabajo);
 	        
 	         long dia = ChronoUnit.DAYS.between(inicio2,diasdeTrabajo);
 	       
 	          
 	            System.out.print(" Ahora dia vale: "+dia+" " + dias);
 	            int seg2 =  (int) (dia % 8);
 	            System.out.print(" El resto de dia entre 8 es: "+ seg2 + "   .    ");
 	            if(seg2 ==1 || seg2 == 3|| seg2== 4){
 	                System.out.println("T-Trabajo el dia:"+dias );
 	               
 	            }else{  
 	                System.out.println("L-Libre el dia:"+ dias );
 	                     
 	            }
 	        }
	} 
	        
}

Bien el problema lo tengo cuando trato de pasar esto a eclipse y en mi proyecto. No se que tuve que hacer para que me apareciese los import de java.Time. y luego cuando lo consigo me da un error de "NoClassDeFoundError".

Por favor como puedo preparar eclipse para que esto no me pase?. Con el android estudio seria mas facil.

Gracias por todo.

Tanto tiempo que ya daba por hecho que lo hubieras solucionado. No pasa nada, seguimos buscando alguna solución.

LocalDate es una biblioteca que pertenece Java 8, que soluciona muchos de los errores que tenían las bibliotecas anteriores y es más fácil de utilizar. Android solo soporta Java 7 que no incorpora esta biblioteca, por lo que no se puede usar LocalDate.

Prueba la biblioteca externa joda-time http://www.joda.org/joda-time/

Hola Ramon .

Por fin  lo he solucionado.Ha sido mucho tiempo ,aunque no lo puedo dedicar muchas horas a la semana. Son demasiados aspectos que no conozco y cada problema con codigo o lo mas preocupante con eclipse, me lleva mucho el poder resolverlo. Menos mal que siempre se encuentras almas caricativas que con una estimablse y desinteresada ayuda,lograis orientar para resolver los inconvenientes.

Al final el metodo me quedo asi:

public List<String> diasdeTrabajo() {
	         
			 LocalDate hoy =LocalDate.now();
			 LocalDate inicio = LocalDate.parse("2014-02-01");
			 
            
			for (int i = 0; i < dias.size(); i++) {
				String[] dateArr =  dias.get(i).split("-"); // date format is yyyy-mm-dd
				 String diaa = dateArr[0];
				 String mes =  dateArr[1] ;
			    String año = dateArr[2];
			int mess=    Integer.parseInt(dateArr[1])+1;
			String messs = String.valueOf(mess);
				 String diac = diaa+"-"+ messs +"-"+año;
				
				
				
				 DateTimeFormatter dtf = DateTimeFormat.forPattern("dd-MM-yyyy");
                 LocalDate diasdeTrabajo =LocalDate.parse(diac, dtf);
                 Days dia = Days.daysBetween(inicio, diasdeTrabajo);
                 int days = dia.getDays(); 
	    

				int seg2 = days % 8;
				if (seg2 == 1 || seg2 == 3 || seg2 == 4) {
					list.add(dias.get(i) + "-CURRO");

				} else {
					list.add(dias.get(i) + "-WHITE");

				}
			}
			return dias;

		}

Seguramente en los siguientes pasos que tengo que acometer necesitare ayuda, porque tendre que realizar o trabajar con clases, apis....que para mi seran la primera vez. Pero siempre tendre la sensacion de que no estoy solo.

Lo dicho Ramon muchas gracias por existir.

Gracias.

De nada. Todo lo que podamos ayudar lo haremos.

Me alegro que encontraras la solución, siempre se termina encontrando aunque se tarde un poco :)