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:
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=180En 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