variable obtener manejo ingresar horas fecha declarar asignar calendar java-7 java-time date-comparison

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?