Сколько unitTime (10 минут, полчаса) существует между 2 localTime? Java 8 - PullRequest
4 голосов
/ 15 марта 2019

Я хочу определить единицу времени, например, 12 минут или 25 минут, чтобы узнать, сколько единиц времени есть между 2 LocalTime в Java.

Например, если я определил 15 минут как единицу времени, между 8:00 и 10:00, я должен получить 8 раз.

Ответы [ 3 ]

6 голосов
/ 15 марта 2019

Вы можете использовать класс Duration , чтобы получить длительность между двумя значениями LocalTime. Затем вы можете самостоятельно рассчитать единицы времени:

int minutesUnit = 15;
LocalTime startTime = LocalTime.of(8, 0);
LocalTime endTime = LocalTime.of(10, 0);
Duration duration = Duration.between(startTime, endTime);
long unitsCount = duration.toMinutes() / minutesUnit;
System.out.println(unitsCount);

Это печатает 8.

Если у вас есть разные единицы времени, вы можете сократить длительность до миллис и вычислить результат:

long millisUnit = TimeUnit.MINUTES.toMillis(15);
// ...
long unitsCount = duration.toMillis() / millisUnit;
4 голосов
/ 15 марта 2019
    Duration unit = Duration.ofMinutes(15);

    LocalTime start = LocalTime.of(8, 0);
    LocalTime end = LocalTime.of(10, 0);

    long howMany = Duration.between(start, end).dividedBy(unit);

    System.out.println("" + howMany + " units");

Выход:

8 единиц

Поскольку в Java 9 Duration есть метод dividedBy(Duration), именно то, что вам нужно здесь.

Ограничение в том, что оно дает вам только целые единицы. Если бы блок был 25 минут, результат был бы 4 (не 4,8) единиц.

2 голосов
/ 16 марта 2019

Вы можете реализовать пользовательский TemporalUnit, основанный на произвольном (положительном) Duration. Вы можете использовать его так же, как и любой другой встроенный ChronoUnit, например,

LocalTime start = LocalTime.parse("08:00");
LocalTime end   = LocalTime.parse("10:00");

DurationUnit min15 = DurationUnit.ofMinutes(15);
System.out.println(min15.between(start, end)); // prints: 8
System.out.println(start.until(end, min15));   // prints: 8
System.out.println(start.plus(3, min15));      // prints: 08:45
DurationUnit min7 = DurationUnit.ofMinutes(7);
System.out.println(min7.between(start, end)); // prints: 17
System.out.println(start.until(end, min7));   // prints: 17
System.out.println(start.plus(3, min7));      // prints: 08:21

Пользовательский TemporalUnit:

public final class DurationUnit implements TemporalUnit {

    private static final int SECONDS_PER_DAY = 86400;
    private static final long NANOS_PER_SECOND =  1000_000_000L;
    private static final long NANOS_PER_DAY = NANOS_PER_SECOND * SECONDS_PER_DAY;

    private final Duration duration;

    public static DurationUnit of(Duration duration)   { return new DurationUnit(duration); }
    public static DurationUnit ofDays(long days)       { return new DurationUnit(Duration.ofDays(days)); }
    public static DurationUnit ofHours(long hours)     { return new DurationUnit(Duration.ofHours(hours)); }
    public static DurationUnit ofMinutes(long minutes) { return new DurationUnit(Duration.ofMinutes(minutes)); }
    public static DurationUnit ofSeconds(long seconds) { return new DurationUnit(Duration.ofSeconds(seconds)); }
    public static DurationUnit ofMillis(long millis)   { return new DurationUnit(Duration.ofMillis(millis)); }
    public static DurationUnit ofNanos(long nanos)     { return new DurationUnit(Duration.ofNanos(nanos)); }

    private DurationUnit(Duration duration) {
        if (duration.isZero() || duration.isNegative())
            throw new IllegalArgumentException("Duration may not be zero or negative");
        this.duration = duration;
    }

    @Override
    public Duration getDuration() {
        return this.duration;
    }

    @Override
    public boolean isDurationEstimated() {
        return (this.duration.getSeconds() >= SECONDS_PER_DAY);
    }

    @Override
    public boolean isDateBased() {
        return (this.duration.getNano() == 0 && this.duration.getSeconds() % SECONDS_PER_DAY == 0);
    }

    @Override
    public boolean isTimeBased() {
        return (this.duration.getSeconds() < SECONDS_PER_DAY && NANOS_PER_DAY % this.duration.toNanos() == 0);
    }

    @Override
    @SuppressWarnings("unchecked")
    public <R extends Temporal> R addTo(R temporal, long amount) {
        return (R) this.duration.multipliedBy(amount).addTo(temporal);
    }

    @Override
    public long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive) {
        return Duration.between(temporal1Inclusive, temporal2Exclusive).dividedBy(this.duration);
    }

    @Override
    public String toString() {
        return this.duration.toString();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...