Круглые минуты до потолка с использованием Java 8

Так что мне посчастливилось использовать Java 8 и новое время APi, но я не вижу никаких функций округления...

В принципе, если время...

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

Кажется, все в порядке, но правильно?

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")));

Ответы

Ответ 1

API java.time не поддерживает округление до потолка, но поддерживает округление до пола (усечение), которое обеспечивает желаемое поведение (что не совсем точно округление до потолка):

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

Кроме того, существует возможность получить часы, которые будут только тикать один раз в минуту, что может представлять интерес:

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

Эти часы автоматически усекают минуты до пола (хотя это указано, чтобы он мог вернуть задержанное кешированное значение). Обратите внимание, что a Clock может быть сохранен в статической переменной, если это необходимо.

Наконец, если это обычная операция, которую вы хотите использовать в нескольких местах, для выполнения округления можно написать библиотеку TemporalAdjuster. (Настройщики могут быть написаны один раз, проверены и доступны как статические переменные или методы).

Ответ 2

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

Это будет округлено до ближайшей минуты, действуя как функция потолка с минутами в качестве целочисленной части.

Ответ 3

java.time (новый API времени в Java 8) имеет без округления функции, как некоторые другие библиотеки. Вы пытаетесь использовать форматирование для округления на String-уровне. Если вы хотите округлить объекты времени, то вы можете сделать это округление вручную:

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1).withSecond(0).withNano(0);
Кстати, вы наверняка имели в виду пол, а не потолок, не так ли?

Update:

Я нашел это немного лучше для установки на пол (очевидно, единственная функция округления, потолок не поддерживается):

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