Je veux définir une unité de temps par exemple, 12 minutes ou 25 minutes, pour savoir combien de temps unitaires il y a entre 2 LocalTime en Java.
Par exemple, si j'ai défini 15 minutes comme unité de temps, entre 8h00 et 10h00, je devrais obtenir 8 fois.
3 Réponses :
Vous pouvez utiliser la classe Duration pour obtenir la durée entre deux valeurs LocalTime. Ensuite, vous pouvez calculer vous-même les unités de temps personnalisées:
long millisUnit = TimeUnit.MINUTES.toMillis(15); // ... long unitsCount = duration.toMillis() / millisUnit;
Ceci imprime 8
.
Si vous avez des unités de temps différentes, vous pouvez interrompre la durée jusqu'à millis et calculez le résultat:
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);
ceci peut également être réalisé avec ChronoUnit.MINUTES.between
que l'OP déjà utilisé
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"); Output: 8 units Since Java 9 Duration has had a dividedBy(Duration) method, just what you need here.The limitation is it gives you only whole units. Had the unit been 25 minutes, the result would be 4 (not 4.8) units.
Vous pouvez mettre en œuvre un TemporalUnit
qui est basé sur un arbitraire (positif) Durée
. Vous pouvez ensuite l'utiliser comme si vous utilisiez n'importe quel ChronoUnit
, par exemple
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(); } }
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
personnalisé:
XXX
LocalDate
ne stocke que les dates, pas les heures, il n'y a donc pas "entre 8h00 et 10h00" lorsque vous utilisezLocalDate
SOrry est localTime
Avez-vous lu la documentation , c'est-à-dire le javadoc de
LocalTime
, pour voir s'il existe des méthodes qui peuvent vous aider? Qu'as-tu essayé? --- Astuce: voirjusqu'à
J'essaye ceci: ChronoUnit.MINUTES.between (start, end) mais le problème est que ChronoUnito n'a déjà défini que unitTime, mais j'ai besoin de spécifier mon propre temps unitaire.
«ChronoUnito n'a déjà défini que UnitTime», puis utilisez la multiplication et la division. Si vous avez X minutes entre 2 dates, alors vous avez X / 20 intervalles de "20 minutes".