Круглые минуты до потолка с использованием 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);