Al restar una cantidad dada de un objeto LocalTime, me he dado cuenta de que el desbordamiento / desbordamiento puede ocurrir.
Ejemplo:
00:30 - 35 minutes = 23:55
23:30 + 35 minutes = 00:05
Para mi solicitud, me gustaría tiempos de cierre de tal manera que lo anterior podría generar 00:00
el flujo inferior, y 23:59
en caso de desbordamiento.
es posible?
Mi sugerencia es:
LocalTime orig = LocalTime.of(0, 30);
int minutesToSubtract = 35;
long minutesSinceMidnight = ChronoUnit.MINUTES.between(LocalTime.MIN, orig);
LocalTime result;
if (minutesToSubtract > minutesSinceMidnight) {
// Subtracting the minutes will pass midnight at start of day
result = LocalTime.MIN;
} else {
// Normal case, no underflow
result = orig.minusMinutes(minutesToSubtract);
}
System.out.println(result);
Lo anterior supone que minutesToSubtract
es no negativo. Si se pueden producir números negativos, es necesario comprobar tanto para flujo inferior y rebosadero.
El caso de la comprobación de desbordamiento (más de 23:59:59.999999999
) es similar. Utilizar LocalTime.MAX
para el final del día.
Editar: Código de JB Nizet para la otra operación en su comentario merece el formato de código adecuado, por lo que estoy pegando aquí:
public static LocalTime addWithoutOverflow(LocalTime baseTime, int minutes) {
LocalTime maxTime = LocalTime.MAX;
long maxNanos = ChronoUnit.NANOS.between(baseTime, maxTime);
long nanos = Duration.ofMinutes(minutes).toNanos();
return baseTime.plusNanos(Math.min(maxNanos, nanos));
}