Autor Tema: Crear calendario elaboracion metodo en java obtener dias laborables  (Leído 37486 veces)

Tino

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 29
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #20 en: 15 de Diciembre 2014, 22:12 »
No me deja mandar el archio rar del proyecto. Se lo puedo mandar donde me digan.

Tino

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 29
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #21 en: 02 de Marzo 2015, 21:35 »
Hola de nuevo. He intentado seguir el hilo pero he debido crear otro.... un desastre.
He creado un proyecto en java con solamente el metodo donde calculo los dias de trabajo, que es el que me esta dando los errores. El codigo es:
 
Código: [Seleccionar]
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.Date;

public class Calendario {

/**
* @param args
* @throws ParseException
*/
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 = "01-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);
  }
}
}
Las variables año, mes y diaa son el inicio del calculo: 1 de enero de 2014
En el String dia voy introduciendo fechas a ver que resultado me da.
Te comentaba que me daba buenos resultados un mes si y otro no....
Y me aparecen cosas muy estrañas:
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.
A que se debe esto?  Me falta codigo?. Como puedo arregrarlo?
Gracias de nuevo.
« Última modificación: 03 de Marzo 2015, 09:35 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #22 en: 03 de Marzo 2015, 10:33 »
Hola, es un poco lioso con los índices, porque los días del mes van de 1 a 31 pero los días transcurridos desde el inicio empiezan en cero. Si llamamos valor a los días transcurridos desde el inicio tendríamos la cadencia: trabajo, libre,trabajo,trabajo, libre, libre, libre, libre.

si valor % 8 = 7 entonces el tipo de día es libre
si valor % 8 = 6 entonces el tipo de día es libre
si valor % 8 = 5 entonces el tipo de día es libre
si valor % 8 = 4 entonces el tipo de día es libre
si valor % 8 = 3 entonces el tipo de día es trabajo
si valor % 8 = 2 entonces el tipo de día es trabajo
si valor % 8 = 1 entonces el tipo de día es libre
si valor % 8 = 0 entonces el tipo de día es trabajo

He modificado los dígitos (en lugar de 1, 3, 4 usar 0, 2, 3) y he hecho una pequeña prueba que parece que funciona bien:

Código: [Seleccionar]
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.Date;

public class Calendario {

/**
* @param args
* @throws ParseException
*/
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();
 
  for (int i=1; i<=30;i++) {
       
  String dias = i+"-01-2014";
         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 ==0 || seg2 == 2|| seg2== 3){
  System.out.println("Trabajo el:"+ dia + " (El dia "+ i + " del mes)");
      }else{ 
    System.out.println("No trabajo el dia:"+ dia + " (El dia "+ i + " del mes)");
  }
  }
 
}
}

Saludos

Tino

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 29
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #23 en: 05 de Marzo 2015, 21:45 »
Hola.
Utilizo los digitos 1,3,4 porque me da valido ciertos meses.
Al correr el metodo que me ha pasado me sige dando los mismos problemas:"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."

En la aplicacion he creado un TexView debajo del calendario. Le voy a pasar un archivo donde aparece la variable "dias" que es la entrada en formato de los dias del mes:
 Es el primer archivo adjunto."febrero". Luego le paso otro con la salida del metodo con los dias de trabajo y no trabajo. Y vera el mes de marzo como la cadencia desaparece, en circulo rojo estan lo que tendria que ser.
Cada vez entiendo menos. Por donde puedo seguir.
Gracias.
No me deja adjuntar: Le dejo un enlace para visualizarlo:
 https://www.dropbox.com/s/wmusvg8mm3k93li/dias.png?dl=0
https://www.dropbox.com/s/xuho254nl9q8vmq/feb-marzo.jpg?dl=0,

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #24 en: 06 de Marzo 2015, 11:01 »
Hola, lo he estado mirando y parte de los problemas pueden tratarse con cierta facilidad y otra parte no.

Cadencia: T-L-T-T-L-L-L-L

Código que he utilizado para las pruebas:

Código: [Seleccionar]
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.Date;

public class Calendario {

    /**
     * @param args
     * @throws ParseException
     */
    public static void main(String[] args) throws ParseException {

        dameCalendario("-01-2014");
        dameCalendario("-02-2014");
        dameCalendario("-03-2014");

    }

    public static void dameCalendario(String mesYaño) throws ParseException {
        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();

        System.out.println("MES ES: "+mesYaño);
        for (int i=1; i<=31;i++) {

            String dias = i+mesYaño;
            Date date = null;
            date = formato.parse(dias );
            System.out.print(" Ahora date vale: "+ date + "    . ");
            cal.setTime(date);
            long dia = cal.getTimeInMillis();
            dia =dia-fecha;
            dia=dia/(1000*60*60*24);
            System.out.print(" Ahora dia vale: "+ dia);
            int seg2 = (int) (dia % 8);
            System.out.print(" El resto de dia entre 8 es: "+ seg2 + "   .    ");
            if(seg2 ==0 || seg2 == 2|| seg2== 3){
                System.out.println("T-Trabajo el:"+ dia + " (El dia "+ i + " del mes)");
            }else{ 
                System.out.println("L-Libre el dia:"+ dia + " (El dia "+ i + " del mes)");
            }
        }

    }
}

Parte tratable: algunas de las fechas que estás relacionando son fechas que no existen, por ejemplo el 31 de febrero de 2015. Estas fechas no deberían intervenir en un programa porque no tienen sentido. Java maneja las fechas que no existen a través de la propiedad lenient mode. lenient mode por defecto está activado, lo que significa que el 31 de febrero de 2015 será tratado como el día válido más próximo (dando un resultado sin sentido donde parece que se pierde la cadencia).

Por ejemplo para los últimos días de febrero de 2014 y comienzo de marzo de 2015 tendríamos esto

L-Libre el dia:52 (El dia 22 del mes)
L-Libre el dia:53 (El dia 23 del mes)
L-Libre el dia:54 (El dia 24 del mes)
L-Libre el dia:55 (El dia 25 del mes)
T-Trabajo el:56 (El dia 26 del mes)
L-Libre el dia:57 (El dia 27 del mes)
T-Trabajo el:58 (El dia 28 del mes)
T-Trabajo el:59 (El dia 29 del mes) - NO VALIDO
L-Libre el dia:60 (El dia 30 del mes)  - NO VALIDO
L-Libre el dia:61 (El dia 31 del mes)  - NO VALIDO
MES ES: -03-2014
T-Trabajo el:59 (El dia 1 del mes)
L-Libre el dia:60 (El dia 2 del mes)
L-Libre el dia:61 (El dia 3 del mes)
L-Libre el dia:62 (El dia 4 del mes)
L-Libre el dia:63 (El dia 5 del mes)
 

Si eliminas los días no válidos, la cadencia se respeta y los resultados son válidos.



Parte difícilmente tratable:

Si analizamos los últimos días de marzo de 2014 tendríamos esto:

T-Trabajo el:80 (El dia 22 del mes)
L-Libre el dia:81 (El dia 23 del mes)
T-Trabajo el:82 (El dia 24 del mes)
T-Trabajo el:83 (El dia 25 del mes)
L-Libre el dia:84 (El dia 26 del mes)
L-Libre el dia:85 (El dia 27 del mes)
L-Libre el dia:86 (El dia 28 del mes)
L-Libre el dia:87 (El dia 29 del mes)
T-Trabajo el:88 (El dia 30 del mes)
T-Trabajo el:88 (El dia 31 del mes) - FALLA, TENDRÍA QUE SER LIBRE Y PONE QUE TRABAJO

El problema aquí parece estar relacionado con que en algunas versiones de Java a la hora de calcular la duración del día toma en consideración el cambio horario de ciertos países (según configuración local) que se produciría por ejemplo en el 31 de marzo. Esto da lugar a que el cálculo de milisegundos no se haga con 24 horas, sino con 23 horas, y el redondeo al calcular el resto hace que lo considere como si en lugar de día 31 fuera día 30. Esto podría corregirse pero...

Recomendación: las clases de java.util.Date y Calendar han pasado a considerarse problemáticas. Para trabajar un problema de este tipo debe usarse java 8 y el paquete java.time.*

Aquí se comenta algo al respecto: http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=619:clase-calendar-y-gregoriancalendar-java-conversion-de-fechas-ejemplos-cambios-desde-java-8-cu00925c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180

En resumen, más que fallo tuyo diría que es fallo de Java. El hecho de que Java estaba fallando lo demuestra el que hayan creado una nueva parte del api con nuevas clases para tratar el tiempo en las nuevas versiones. Si lo que había en anteriores versiones hubiera funcionado bien no lo hubieran cambiado.

Por tanto, ¿por dónde seguir? -- > Usar java 8 con las nuevas clases del paquete java.time

Saludos
« Última modificación: 06 de Marzo 2015, 11:11 por Alex Rodríguez »

Tino

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 29
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #25 en: 23 de Marzo 2015, 19:29 »
Hola. Lo primero muchisimas gracias porque utilizando java 8 con java.time. el problema aparentemente desaparece.
Bien pero ahora quieroutilizarlo en android, en el proyecto que tengo y no exixte la Clse ni los import. Cimo puedo solucionar esto? Tengo que empezar de cero?. Me he descargado el eclipse luna que mirando si acepta java8 pero importo el proyecto y tampoco nada.
Y ahora que?
Muchisimas gracias de nuevo.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #26 en: 23 de Marzo 2015, 21:14 »
Hola lo primero pega el código Java que constituye la solución, será justo para quien haya leído o colaborado en el hilo poder ver la solución... quizás ayude a otras personas con problemas similares.

Tino

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 29
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #27 en: 23 de Marzo 2015, 21:25 »
Perdon. La variable i la doy un valor de 10 porque con 1 me da error.
Tambien los meses que tienen 30 dias. Pero para comprobar los errores anteriores es suficiente.
Código: [Seleccionar]
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;


public class Calendario {

/**
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub

   dameCalendario("2015-01-");
        //dameCalendario("2015-02-");
        dameCalendario("2015-03-");
      //  dameCalendario("2015-04-");
        dameCalendario("2015-05-");
        dameCalendario("2015-07-");
       
}
       
        public static void dameCalendario(String mesYaño) throws ParseException {

   
   
  LocalDate hoy = LocalDate.now();
  LocalDate inicio = LocalDate.of(2014, Month.FEBRUARY,1);
  LocalDate inicio2 = LocalDate.parse("2014-02-01");
  //Period dif = Period.between(hoy, inicio);
  long dif = ChronoUnit.DAYS.between(inicio,hoy);
 
 
    for (int i=10; i<=31;i++) {
         
String dias =mesYaño+i;

   
             LocalDate diatrabajo = LocalDate.parse(dias);
   
         
             
            long dia = ChronoUnit.DAYS.between(inicio,diatrabajo);
           
              System.out.print(" Ahora dia vale: "+dia);
              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:"+ diatrabajo );
              }else{ 
                  System.out.println("L-Libre el dia:"+ diatrabajo );
              }
          }
}
       
}
Gracias

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #28 en: 23 de Marzo 2015, 21:48 »
Gracias. Para el paso a android no sé decirte con exactitud cómo podría hacerse... Este ejemplo parece estar bien: http://examples.javacodegeeks.com/android/core/activity/android-timertask-example/

Supongo que tendrás que buscar la forma de trasladarlo, o bien programarlo manualmente  ::) Si hay algún experto en android por ahí a ver si nos puede echar una mano.

Tino

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 29
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #29 en: 23 de Marzo 2015, 22:26 »
Hola de nuevo, creo que lo voy solucionando. Ya consigo que los import aparezca java.time.
He hecho esto:i solved this problem by trying following solution

Project > Properties > Java Build Path
Select Libraries tab
Select JRE System Library
Click Edit button
Choose an alternate JRE (jre1.8.0_20)
Click Finish button

Si alguien lo necesita que me lo diga ,porque soy muy necio y no tengo muy claro lo que he hecho configurando el eclipse.
Gracias de nuevo y reportare el resultado si es ok???? que lo pongo en duda; habra mas problemas.

Tino

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 29
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #30 en: 08 de Mayo 2015, 21:21 »
Hola Alex.
Creí que nunca lo iba a poder decir, pero este tema lo hemos solucionado. Han pasado muchos dias pero no lo puedo dedicar mucho tiempo a la semana. Ademas de mi torpeza.....
Bien al parecer eclipse o android no trabaja con java 8. Con lo cual no podia emular el proyecto, me daba unos errores indescriptibles...Alguien me aconsejo que utilizara esta libreria;http://www.joda.org/joda-time/. Asi lo hice y despues de no pocos problemas (el eclipse lo estoy cogiendo panico) todo salió. El metodo dichoso queda asi:
Código: [Seleccionar]
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;

}
Hay lineas de codigo en el ciclo for que las tengo que utilizar porque me daba problemas con los meses despues de novienbre(tamaño de un array).
Gracias a gente como vosotros, principiantes como yo pueden tener satisfaciones como la que tuve el otro dia cuando por fin me salio el calendario. Muchas gracias por el tiempo que me has dedicado. Yo seguire con mi proyecto,pero con la seguridad que me da el saber que no estoy solo.
Lo dicho, gracias por existir y hasta la proxima.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ayuda elaboracion metodo en java obtener dias laborables
« Respuesta #31 en: 10 de Mayo 2015, 17:22 »
Hola, me he alegrado al leer tu mensaje. Mi enhorabuena pues aunque te ha costado bastante tiempo, al final lo has logrado. El mérito es tuyo. Cuenta siempre con que desde estos foros intentaremos ayudar en la medida de nuestras posibilidades. Suerte!!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".