datetime java-8 rounding java-time ceiling

datetime - Minutos redondos al techo utilizando Java 8.



java-8 rounding (3)

Así que tengo la suerte de usar Java 8 y el nuevo APi de tiempo, pero no veo ninguna función de redondeo ...

Básicamente si el tiempo es ...

2014-08-28T10:01.00.000 ----> 2014-08-28T10:02.00.000 2014-08-28T10:01.10.123 ----> 2014-08-28T10:02.00.000 2014-08-28T10:01.25.123 ----> 2014-08-28T10:02.00.000 2014-08-28T10:01.49.123 ----> 2014-08-28T10:02.00.000 2014-08-28T10:01.59.999 ----> 2014-08-28T10:02.00.000

Esto parece estar bien, pero ¿está bien?

LocalDateTime now = LocalDateTime.now(Clock.systemUTC()); LocalDateTime newTime = now.plusMinutes(1); System.out.println(newTime.toString()); System.out.println(newTime.format(DateTimeFormatter.ofPattern("yyyy-dd-MM''T''HH:mm:00.000")));


La API java.time no admite el redondeo al techo, sin embargo, admite el redondeo al piso (truncamiento) que permite el comportamiento deseado (que no es exactamente el redondeo al techo):

LocalDateTime now = LocalDateTime.now(); LocalDateTime roundFloor = now.truncatedTo(ChronoUnit.MINUTES); LocalDateTime roundCeiling = now.truncatedTo(ChronoUnit.MINUTES).plusMinutes(1);

Además, hay una facilidad para obtener un reloj que solo marca una vez por minuto, lo que puede ser de interés:

Clock minuteTickingClock = Clock.tickMinutes(ZoneId.systemDefault()); LocalDateTime now = LocalDateTime.now(minuteTickingClock); LocalDateTime roundCeiling = now.plusMinutes(1);

Este reloj truncará automáticamente los minutos al piso (aunque se specified tal manera que puede devolver un valor en caché retrasado). Tenga en cuenta que un Clock puede almacenarse en una variable estática si lo desea.

Finalmente, si esta es una operación común que desea utilizar en varios lugares, es posible escribir una función de TemporalAdjuster biblioteca para realizar el redondeo. (Los ajustadores pueden escribirse una vez, probarse y ponerse a disposición como una variable o método estático).


java.time (la nueva API de tiempo en Java 8) no tiene características de redondeo como otras bibliotecas. Intenta utilizar el formato para redondear en el nivel de cadena. Sin embargo, si desea redondear los objetos de tiempo, puede hacerlo manualmente:

LocalDateTime now = LocalDateTime.now(Clock.systemUTC()); LocalDateTime newTime = now.plusMinutes(1).withSecond(0).withNano(0);

Por cierto, seguramente quisiste decir piso, no techo, ¿verdad?

Actualizar:

He encontrado esta forma ligeramente mejor de configurar el piso (obviamente, la única función de redondeo, el techo no es compatible):

LocalDateTime now = LocalDateTime.now(Clock.systemUTC()); LocalDateTime newTime = now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES);


LocalDateTime newTime = now.plusMinutes(1).minusNanos(1).withSecond(0).withNano(0);

Esto se redondeará al minuto más cercano, actuando como una función de techo con minutos como la parte entera.