Sé que este hilo es de dos años ahora, todavía no veo una respuesta correcta.
A menos que desee utilizar Joda o tener Java 8 y si necesita restar fechas influenciadas por el horario de verano.
Así que he escrito mi propia solución. El aspecto importante es que sólo funciona si realmente sólo se preocupan por las fechas porque es necesario desechar la información de tiempo, así que si quieres algo así como 25.06.2014 - 01.01.2010 = 1636
, esto debería funcionar independientemente del horario de verano:
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
public static long getDayCount(String start, String end) {
long diff = -1;
try {
Date dateStart = simpleDateFormat.parse(start);
Date dateEnd = simpleDateFormat.parse(end);
//time is always 00:00:00 so rounding should help to ignore the missing hour when going from winter to summer time as well as the extra hour in the other direction
diff = Math.round((dateEnd.getTime() - dateStart.getTime())/(double) 86400000);
} catch (Exception e) {
//handle the exception according to your own situation
}
return diff;
}
A medida que el tiempo siempre es 00:00:00
, usando doble y luego Math.round()
debería ayudar a ignorar los 60000ms faltantes (1 hora) cuando se pasa del invierno al horario de verano, así como la hora extra si va de verano a invierno.
Esto es una pequeña prueba junit4 utilizo para probarlo:
@Test
public void testGetDayCount() {
String startDateStr = "01.01.2010";
GregorianCalendar gc = new GregorianCalendar(locale);
try {
gc.setTime(simpleDateFormat.parse(startDateStr));
} catch (Exception e) {
}
for (long i = 0; i < 10000; i++) {
String dateStr = simpleDateFormat.format(gc.getTime());
long dayCount = getDayCount(startDateStr, dateStr);
assertEquals("dayCount must be equal to the loop index i: ", i, dayCount);
gc.add(GregorianCalendar.DAY_OF_YEAR, 1);
}
}
... o si desea ver lo que hace 'vida', reemplace la afirmación con sólo:
System.out.println("i: " + i + " | " + dayCount + " - getDayCount(" + startDateStr + ", " + dateStr + ")");
... y esto es lo que la salida debe ser similar:
i: 0 | 0 - getDayCount(01.01.2010, 01.01.2010)
i: 1 | 1 - getDayCount(01.01.2010, 02.01.2010)
i: 2 | 2 - getDayCount(01.01.2010, 03.01.2010)
i: 3 | 3 - getDayCount(01.01.2010, 04.01.2010)
...
i: 1636 | 1636 - getDayCount(01.01.2010, 25.06.2014)
...
i: 9997 | 9997 - getDayCount(01.01.2010, 16.05.2037)
i: 9998 | 9998 - getDayCount(01.01.2010, 17.05.2037)
i: 9999 | 9999 - getDayCount(01.01.2010, 18.05.2037)
parece que este método es exclusiva y no es inclusivo, por lo que podría querer agregar 1 al resultado (o agregar ** 25 ** (y no 24) horas a 'date2') para que sea inclusivo. –
@AlaaM .: Bueno, * si * quieres que sea inclusivo. Si me preguntaran el número de días entre el 24 de diciembre y el 25 de diciembre, diría que 1, no 2 ... (Y el OP parece lo suficientemente feliz) –
Sí, es por eso que dije * podría querer *. En mi caso, necesitaba mostrar "los días restantes hasta el vencimiento". Entonces, en mi opinión, este caso debería ser inclusivo –