manejo - obtener fecha java calendar
ComparaciĆ³n de fechas en Java 7 usando el calendario (1)
Los constructores de Date
(como el que estás usando: new Date(2017,1,1)
) no solo están en desuso (por lo que debes evitarlos) sino que también son engañosos , porque los años están indexados en 1900 (entonces 2017 se convierte en 3917) y los meses tienen índice cero (los valores están en el rango cero (enero) a 11 (diciembre)). Entonces esto no se comporta como crees:
Date start = new Date(2017, 1, 1); // February 1st 3917
Date end = new Date(2017, 6, 30); // July 30th 3917
Cuando agrega 6 meses para start
, se convierte en 1 de agosto , que es después de end
.
Para crear el 1 de enero y el 30 de junio, debe usar el month - 1
y para que el año 2017 tenga que usar 117 (2017 - 1900):
Date start = new Date(117, 0, 1); // January 1st 2017
Date end = new Date(117, 5, 30); // June 30th 2017
Aunque, el start
más 6 meses será el 1 de julio , que sigue siendo después del end
(para que su código arroje la excepción).
Las clases antiguas ( Date
, Calendar
y SimpleDateFormat
) tienen muchos problemas y problemas de diseño , y están siendo reemplazadas por las nuevas API.
En Java <= 7 , puede utilizar el ThreeTen Backport , un gran backport para las nuevas clases de fecha / hora de Java 8.
Esta nueva API tiene muchos tipos nuevos de fecha y hora para tratar diferentes situaciones. Como solo estamos lidiando con fechas (día / mes / año), podemos usar una org.threeten.bp.LocalDate
:
LocalDate start = LocalDate.of(2017, 1, 1); // January 1st 2017
LocalDate end = LocalDate.of(2017, 6, 30); // June 30th 2017
// 6 months after start
LocalDate sixMonthsLater = start.plusMonths(6);
if (sixMonthsLater.isAfter(end)) {
// throw exception
}
Estoy comparando la fecha de inicio de un tratamiento con su fin para verificar si dura más de 6 meses. Si el período no incluye el mes de febrero, todo está bien, pero si comparo el 1 de enero con el 30 de junio arrojaré mi Excepción. Para comparar ambos períodos, agrego 6 meses a la Fecha de inicio y comparo el resultado con la Fecha de finalización así:
Date start = new Date(2017,1,1);
Date end = new Date(2017,6,30);
Calendar startOfTreatment = new Calendar.getInstance();
startOfTreatment.setTime(start);
Calendar endOfTreatment = new Calendar.getInstance();
endOfTreatment.setTime(end);
startOfTreatment.add(Calendar.MONTH, 6);
if (startOfTreatment.compareTo(endOfTreatment) > 0) {
throw new InfinishedTreatmentException(startOfTreatment,endOfTreatment);
}
¿Cómo puedo arreglar esto?